Как использовать статический ресурс строки для значения DataTrigger, связанного с полем со списком SelectedItem? - PullRequest
0 голосов
/ 18 мая 2019

Я использую некоторые ComboBox, что их ComboBoxItems являются набором StaticResource строк.Я хочу изменить видимость ComboBox, чтобы он свернулся, когда выбран один из элементов другого ComboBox, используя его SeletedItem NOT SelectedIndex.

Для этого я написал следующий код, но Visual Studio показываетэто сообщение об ошибке: «После использования DataTrigger (запечатанный) его нельзя изменить».

<Window x:Class="CB.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:CB"
    mc:Ignorable="d"
    Title="MainWindow" Height="177" Width="179">
<Window.Resources>
    <system:String x:Key="Str1">String1</system:String>
    <system:String x:Key="Str2">String2</system:String>
    <system:String x:Key="Str3">String3</system:String>
</Window.Resources>
<StackPanel>
    <ComboBox x:Name="CB1">
        <ComboBoxItem Content="{StaticResource Str1}"/>
        <ComboBoxItem Content="{StaticResource Str2}"/>
        <ComboBoxItem Content="{StaticResource Str3}"/>
    </ComboBox>
    <ComboBox x:Name="CB2">
        <ComboBox.Style>
            <Style TargetType="ComboBox">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=CB1, Path=SelectedItem}" Value="{StaticResource Str3}">
                                                                              <!--Error ^: After a 'DataTrigger' is in use (sealed), it cannot be modified. --> 
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ComboBox.Style>
        <ComboBoxItem Content="{StaticResource Str1}"/>
        <ComboBoxItem Content="{StaticResource Str2}"/>
        <ComboBoxItem Content="{StaticResource Str3}"/>
    </ComboBox>
</StackPanel>

Не могли бы вы помочь мне с этой проблемой, возможно, с использованием WPFкод?

РЕДАКТИРОВАТЬ: Пожалуйста, кто-нибудь ответьте на мой вопрос!

1 Ответ

0 голосов
/ 24 мая 2019

Вы можете использовать MultiDataTrigger вместо DataTrigger и использовать ComboBoxItemToStringConverter:

public class ComboBoxItemToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var combo = value as ComboBoxItem;
        string content = combo?.Content.ToString();
        return content;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Тогда Вы используете:

<Window.Resources>
    ...
    <local:ComboBoxItemToStringConverter x:Key="ObjectToStringConverter" />
</Window.Resources>

<ComboBox.Style>
    <Style TargetType="ComboBox">
        <Setter Property="Visibility" Value="Visible" />
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding ElementName=CB1, Path=SelectedItem, Converter={StaticResource ComboBoxItemToStringConverter}}" Value="{StaticResource Str3}" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Visibility" Value="Collapsed" />
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</ComboBox.Style>

Я надеюсь, что это работает для вас.

Редактировать: Если вы не хотите использовать код C #.Вместо использования «SelectedItem» используйте текст:

<Condition Binding="{Binding ElementName=CB1, Path=Text}" Value="{StaticResource Str3}" />

и удалите конвертер.

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