WPF基于另一个组合框启用组合框

时间:2015-03-31 01:38:54

标签: wpf .net-4.5 wpf-style

我知道已经有很多做类似事情的例子,我已经读过这些但是无法弄清楚为什么我的实现不起作用。

当ComboBoxA设置为值X时,我试图禁用ComboBoxB。通过此实现,无论在ComboBoxA中选择的值如何,ComboBoxB始终都会启用。

ComboBoxA:

<ComboBox  Name="ComboBoxA">
    <ComboBoxItem Name="X">X</ComboBoxItem>
    <ComboBoxItem Name="Y">Y</ComboBoxItem>
</ComboBox>

ComboBoxB:

<ComboBox Name="ComboBoxB">
    <ComboBoxItem Name="Something">Something</ComboBoxItem>
    <ComboBox.Style>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="IsEnabled" Value="True" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxA}" Value="X">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

2 个答案:

答案 0 :(得分:0)

您从未对ComboboxA进行过数据绑定。

您的引用元素名称“ComboboxA”而非“ComboboxB”

你有:

<DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxB}" Value="X">

这应该是:

<DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxA}" Value="X">

<ComboBox Name="ComboBoxB">
    <ComboBoxItem Name="Something">Something</ComboBoxItem>
    <ComboBox.Style>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="IsEnabled" Value="True" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxA}" Value="X">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

答案 1 :(得分:0)

您可以使用转换器执行此操作。

public class SelectedItemToDisable : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

         if (value != null)
         {
            var val = (value as ComboBoxItem).Content;
             if (val.ToString() == "X") //may be its not string, some object type 
                 return false;
         }
        return true;
    }

在Xaml中的资源部分定义转换器。

<local:SelectedItemToDisable x:Key="DisableConverter"/>

<ComboBox  Name="ComboBoxA">
 <ComboBoxItem Name="X">X</ComboBoxItem>
 <ComboBoxItem Name="Y">Y</ComboBoxItem>
</ComboBox>
<ComboBox Name="ComboBoxB" IsEnabled="{Binding Path=SelectedItem, ElementName=ComboBoxA, Converter={StaticResource DisableConverter}}">
 <ComboBoxItem Name="Something">Something</ComboBoxItem>
</ComboBox>

希望这有帮助。