Как выполняется привязка данных WPF с использованием источника данных объекта в Visual Studio 2010? - PullRequest
1 голос
/ 23 апреля 2010

Это, вероятно, в основном вопрос о том, как использовать инструменты IDE VS 2010 так, как это специально не предназначалось для Microsoft. Но так как это то, что я сразу же попытался безуспешно.

Я определил проект приложения .NET 4.0 WPF с простым классом, который выглядит следующим образом:

Public Class Class1
    Public Property One As String = "OneString"
    Public Property Two As String = "TwoString"
End Class

Затем я определил его как «Источник данных объекта» в VS2010, используя функцию «Добавить новый источник данных ...» в среде IDE. Это предоставляет членам класса элемент GUI в IDE, как показано на следующем рисунке: Image of Data Sources Tool

Перетаскивание «Class1» из этого инструмента на поверхность «Window1.xaml» в стандартном «приложении WPF» приводит к тому, что представление проекта выглядит следующим образом:

Dragged from Data Sources Tool

И сгенерированный XAML так:

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="133" Width="170" xmlns:my="clr-namespace:WpfApplication1" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
>
<Window.Resources>
    <CollectionViewSource x:Key="Class1ViewSource" d:DesignSource="{d:DesignInstance my:Class1, CreateList=True}" />
</Window.Resources>
<Grid DataContext="{StaticResource Class1ViewSource}" HorizontalAlignment="Left" Name="Grid1" VerticalAlignment="Top">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Label Content="One:" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
    <TextBlock Grid.Column="1" Grid.Row="0" Height="23" HorizontalAlignment="Left" Margin="3" Name="OneTextBlock" Text="{Binding Path=One}" VerticalAlignment="Center" />
    <Label Content="Two:" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left" Margin="3" VerticalAlignment="Center" />
    <TextBlock Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="3" Name="TwoTextBlock" Text="{Binding Path=Two}" VerticalAlignment="Center" />
</Grid>

Обратите внимание на привязки данных Text="{Binding Path=One}" и Text="{Binding Path=Two}" в элементах TextBlock.

Код для Window1.xaml имеет это в Window_Loaded:

   Class Window1
        Private m_c1 As New Class1
        Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            Dim Class1ViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("Class1ViewSource"), System.Windows.Data.CollectionViewSource)
            'Load data by setting the CollectionViewSource.Source property:
            'Class1ViewSource.Source = [generic data source]
            Me.DataContext = m_c1
        End Sub
    End Class

При запуске приложения выводится следующее:

Running Application

Ожидаемый результат состоял в том, что «OneString» появилось бы рядом с «One» и «TwoString» рядом с «Two» в рабочем окне.

Вопрос: почему это не сработало? Что будет работать вместо этого? Если я помещаю привязки в DataTemplate, это работает. Blend с его примерами данных подразумевал, что это должно работать, но это не так. Я знаю, что мне здесь не хватает чего-то довольно фундаментального; что это?

1 Ответ

0 голосов
/ 23 апреля 2010

Я нашел этот ответ относительно быстро, поэтому я отвечу на свой вопрос.

Сгенерированный код XAML содержит это:

<Grid DataContext="{StaticResource Class1ViewSource}"

Удаление DataContext="{StaticResource Class1ViewSource}" удаляло что-то, что маскировало Window.DataContext, и привязка работала.

...