Условно выберите ComboBox ItemTemplate для всех предметов - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть форма с двумя ComboBox. Второй ComboBox содержит список клиентов. Первый ComboBox позволяет пользователю выбирать, как он хочет искать клиентов и видеть их на экране. В настоящее время кто-то использует разные хранимые процедуры для каждого типа поиска, просто чтобы изменить способ отображения в раскрывающемся списке. Я хотел бы изменить его так, чтобы он выбирал шаблон данных на основе выбора первого раскрывающегося списка.

например. Если вы выберете Первый / Последний из первого ComboBox, клиенты будут отображаться во втором раскрывающемся списке ComboBox как:

Джон Доу
1234 Поддельный Св. Чандлер, Аз
(480) 555-2342

Если вы измените его на Last / First, клиенты будут отображаться в раскрывающемся списке как:

Доу, Джон
1234 Поддельный Св. Чандлер, Аз
(480) 555-2342

Или, если вы выберете Email, он будет отображаться как:

JDoe@gmail.com
Джон Доу
1234 Поддельный Св. Чандлер, Аз

Я знаю, как писать шаблоны, но как мне установить второй ComboBox.ItemTemplate на основе выбора первого ComboBox? Я хотел бы использовать триггеры или код C #.

РЕДАКТИРОВАТЬ: Вот одна попытка, которую я только что попробовал, но шаблон не меняется. Я знаю, что триггер работает, потому что фон становится зеленым.

<UserControl.Resources>
    <DataTemplate x:Key="ComboBoxCustomTemplate">
        <Grid Margin="3 3">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="{Binding Name}" />
            <WrapPanel Grid.Row="1" Orientation="Horizontal">
                <TextBlock Text="Address:" />
                <TextBlock HorizontalAlignment="Left" Foreground="#003366" Margin="3,0,0,0" Text="{Binding Address}" />
            </WrapPanel>
            <WrapPanel Grid.Row="2" Orientation="Horizontal">
                <TextBlock Text="Phone:" />
            <TextBlock HorizontalAlignment="Left" Foreground="#003366" Margin="3,0,0,0" Text="{Binding Telephone}" />
            </WrapPanel>                                
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="ComboBoxEmailTemplate">
        <Grid Margin="3 3">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="{Binding Email}" />
            <WrapPanel Grid.Row="1" Orientation="Horizontal">
                <TextBlock Text="Address:" />
                <TextBlock HorizontalAlignment="Left" Foreground="#003366" Margin="3,0,0,0" Text="{Binding Address}" />
            </WrapPanel>
            <WrapPanel Grid.Row="2" Orientation="Horizontal">
                <TextBlock Text="Phone:" />
                <TextBlock HorizontalAlignment="Left" Foreground="#003366" Margin="3,0,0,0" Text="{Binding Telephone}" />
            </WrapPanel>
        </Grid>
    </DataTemplate>
</UserControl.Resources>

<ComboBox Name="cbSearchFilter" Padding="5,1" Width="150" Margin="3,3,10,3" SelectionChanged="cbSearchFilter_SelectionChanged" Style="{StaticResource VirtualizingComboBox}">
            <ComboBoxItem Content="Parent Last/First" Tag="LastFirst" />
            <ComboBoxItem Content="Parent First/Last" Tag="FirstLast" />
            <ComboBoxItem Content="Student First/Last" Tag="Student" IsSelected="True" />
            <ComboBoxItem Content="Parent Phone Number" Tag="PhoneNumber"/>
            <ComboBoxItem Content="Parent Email" Tag="Email"/>
        </ComboBox>

<ComboBox Name="cbCustomers"
                SelectedValuePath="FamilyID"
                ItemTemplate="{StaticResource ComboBoxCustomTemplate}"
                Grid.Column="1" Grid.Row="2" IsEditable="True" StaysOpenOnEdit="True"
                KeyboardNavigation.IsTabStop="False" SelectionChanged="rcbCustomers_SelectionChanged" KeyUp="rcbCustomers_KeyUp" KeyDown="rcbCustomers_KeyDown" >
            <ComboBox.Style>
                <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource VirtualizingComboBox}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=cbSearchFilter, Path=SelectedItem.Tag}" Value="Email">
                            <DataTrigger.Setters>
                                <Setter Property="Background" Value="Green" />
                                <Setter Property="ItemTemplate" Value="{StaticResource ComboBoxEmailTemplate}" />
                            </DataTrigger.Setters>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ComboBox.Style>
        </ComboBox>

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Вы можете использовать DataTrigger следующим образом:

<Style x:Key="ComboBox2Style">
    <Setter Property="ItemTemplate" Value="{StaticResource DefaultTemplate}" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding SelectedValue, ElementName=ComboBox1}" Value="LastFirst">
            <Setter Property="ItemTemplate" Value="{StaticResource LastNameFirstTemplate}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding SelectedValue, ElementName=ComboBox1}" Value="Email">
            <Setter Property="ItemTemplate" Value="{StaticResource EmailTemplate}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

Редактировать

Только что заметил, что редактирование вашего вопроса.Проблема с тем, что у вас есть ItemTemplate, определена в теге <ComboBox />.В соответствии с правилами Приоритет свойства зависимостей WPF значение, определенное непосредственно в теге, перезаписывает любые стилизованные или триггерные значения.Чтобы шаблон Trigged вступил в силу, установите значение по умолчанию ItemTemplate в ComboBox Style

0 голосов
/ 04 ноября 2011

Вы можете использовать ItemTemplateSelector . Он выберет правильный шаблон для вас на основе выбора в первом ComboBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...