Выборочная привязка данных к коллекции - PullRequest
0 голосов
/ 31 марта 2011

Я хочу выборочно связать данные в коллекции с различными элементами пользовательского интерфейса. Например, у меня есть коллекция объектов, где у каждого объекта есть свойство, которое описывает тип этого объекта. В настоящее время я использую DataTemplate для классификации элементов. Но когда я назначаю коллекцию двум разным контейнерам пользовательского интерфейса, несмотря на наличие шаблонов данных, объекты добавляются в оба контейнера. Следующий код сделает вопрос более понятным:

Вид:

Шаблоны данных:

        <DataTemplate x:Key="ColumnDataTemplate">
        <Label DataContext="{Binding ColumnDiscriptor}" Foreground="White" Background="DarkOrange" BorderThickness="5">
            <TextBlock Text="{Binding ColumnName}">
            <!--<Run Text="{Binding TableName}"/><Run Text="."/><Run Text="{Binding ColumnName}"/>-->
            </TextBlock>
        </Label>
    </DataTemplate>
    <DataTemplate x:Key="ControllerDataTemplate">
        <Label Content="{Binding OperatorValue}" Foreground="White" Background="Crimson" BorderThickness="5">
        </Label>
    </DataTemplate>
    <DataTemplate x:Key="ValueDataTemplate">
        <TextBox Text="{Binding Path=ComparedValue, Mode= TwoWay}" Height="24" HorizontalAlignment="Left" Width="46" />
    </DataTemplate>

    <DataTemplate x:Key="JoinDataTemplate">
            <Grid>
            <!--<Run Text="{Binding TableName}"/><Run Text="."/><Run Text="{Binding ColumnName}"/>-->
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="80*"/>
                </Grid.RowDefinitions>

                <Label Grid.Row="0" Grid.Column="0" DataContext="{Binding ColumnDiscriptor}" Foreground="Black" Background="Brown" BorderThickness="5">
                    <TextBlock Text="{Binding ColumnName}">
                    </TextBlock>
                </Label>

            <Label Grid.Row="0" Grid.Column="1" DataContext="{Binding JoinWithColumnDescriptor}" Foreground="Black" Background="Beige" BorderThickness="5">
                <TextBlock Text="{Binding Path=ColumnName}">
                    </TextBlock>
                </Label>
            </Grid>
    </DataTemplate>

 <local:QueryObjectDataTemplateSelector x:Key="ModelSelector"
                                       ColumnTemplate="{StaticResource ColumnDataTemplate}"
                                       ControllerTemplate="{StaticResource ControllerDataTemplate}"
                                       ValueTemplate="{StaticResource ValueDataTemplate}"
                                       />

UI Контейнеры:

<ListBox  Height="146" HorizontalAlignment="Left" Margin="12,38,0,0" Name="visulaqueryPanel" VerticalAlignment="Top" Width="344" Background="#18EBEBE2" AllowDrop="True" Drop="Item_Drop" DragEnter="Item_DragEnter"  ItemsSource="{Binding ViewUIElements}" ItemsPanel="{StaticResource WrapPanelTemplate}" 
              ItemTemplateSelector="{StaticResource ModelSelector}" SelectedItem="{Binding Path=SelectedDesignerVisualQueryObject}"/>

<ListBox AllowDrop="True" Background="#1CFFFFFF" Margin="10,38,6,39" Name="grid1" Drop="Join_Item_Drop" DragEnter="Item_DragEnter" ItemsSource="{Binding ViewUIElements}" ItemTemplate="{StaticResource JoinDataTemplate}" SelectedItem="{Binding Path=SelectedDesignerVisualQueryObjectJoin}" />

Согласно моей проблеме ViewUIElemetns - это коллекция, состоящая из объектов разных типов.

Заранее спасибо.

1 Ответ

1 голос
/ 31 марта 2011

просто определите различные DataTemplates на основе типа:

<DataTemplate DataType="{x:Type SomeType1}">
 ...
</DataTemplate> 

<DataTemplate DataType="{x:Type SomeType2}">
 ...
</DataTemplate> 

, если вам нужно сделать это по свойству, а не по типу, тогда вы должны использовать DataTemplateSelector: http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector

...