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

WPF基于另一个组合框启用组合框,wpf,.net-4.5,wpf-style,Wpf,.net 4.5,Wpf Style,我知道已经有很多做类似事情的例子了,我已经读过了,但是我不明白为什么我的实现不起作用 当ComboBoxA设置为值X时,我试图禁用ComboBoxB。在这个实现中,ComboBoxB始终处于启用状态,而不管ComboBoxA中选择的值是什么 ComboBoxA: <ComboBox Name="ComboBoxA"> <ComboBoxItem Name="X">X</ComboBoxItem> <ComboBoxItem Name="

我知道已经有很多做类似事情的例子了,我已经读过了,但是我不明白为什么我的实现不起作用

当ComboBoxA设置为值X时,我试图禁用ComboBoxB。在这个实现中,ComboBoxB始终处于启用状态,而不管ComboBoxA中选择的值是什么

ComboBoxA:

<ComboBox  Name="ComboBoxA">
    <ComboBoxItem Name="X">X</ComboBoxItem>
    <ComboBoxItem Name="Y">Y</ComboBoxItem>
</ComboBox>
组合框B:

<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>

您从未对ComboboxA执行过数据绑定

您的引用元素名ComboboxA而不是ComboxB

你有:

<DataTrigger Binding="{Binding Path=SelectedItem,ElementName=ComboBoxB}" Value="X">
这应该是:

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


您可以使用转换器来完成此操作

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>

希望这能有所帮助。

抱歉,当我简化问题中使用的名称时,这是一个打字错误。我的真实ComboBoxB正确绑定到ComboBoxA。我更新了示例,但这不适用于我。有什么想法吗?在输出窗口中,您是否观察到任何绑定错误?在输出或错误列表中没有错误。如果我在发布的简单示例中没有错误,我可以用我的实际代码更新这个问题。如果您按名称跟踪CITEM中的值,您可能需要考虑将该值移到TAG属性。这是一个免费的标签,你可以指定一个值,并在需要时引用或绑定。只是一个建议。
<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>