WPF:条件绑定

时间:2014-08-19 18:18:26

标签: .net wpf xaml

如果我的CheckBox被选中,我想禁用ComboBox并选择“是”。这是有效的,我想要做的是使这个条件,当我取消选中CheckBox MyBooleanProperty没有更新,仍然选择“是”。如果需要,ComboBox本身应允许我选择“否”。

<CheckBox Name="chkDefault" IsChecked="{Binding MyBooleanProperty, Mode=OneWayToSource}" />
<ComboBox IsEnabled="{Binding IsChecked, ElementName=chkDefault, Converter={StaticResource InverseBooleanConverter}}">
    <ComboBoxItem Content="No" />
    <ComboBoxItem Content="Yes" IsSelected="{Binding MyBooleanProperty}" />
</ComboBox>

过去,我已经使用多个属性(见下文)完成了这项工作,但我想知道在XAML中是否存在一些我不知道的事情。

观点......

<CheckBox IsChecked="{Binding MyBooleanProperty, Mode=OneWayToSource}" />
<ComboBox IsEnabled="{Binding MyBooleanProperty, Converter={StaticResource InverseBooleanConverter}}">
    <ComboBoxItem Content="No" />
    <ComboBoxItem Content="Yes" IsSelected="{Binding MyOtherBooleanProperty}" />
</ComboBox>

ViewModel ......

public bool MyBooleanProperty
{
    get { return _myBooleanProperty; }
    set
    {
        if (_myBooleanProperty != value)
        {
             _myBooleanProperty = value;

             if (_myBooleanProperty)
                MyOtherBooleanProperty = true;

             base.OnPropertyChanged("MyBooleanProperty");
        }
    }
}

public bool MyOtherBooleanProperty
{
    get { return _myOtherBooleanProperty; }
    set
    {
        if (_myOtherBooleanProperty != value)
        {
             _myOtherBooleanProperty = value;

             base.OnPropertyChanged("MyOtherBooleanProperty");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您正在描述您希望视图具有的逻辑。至少对我来说,这通常意味着这种逻辑属于视图模型。

但是,我不会像你那样做绑定。我会用这样的东西:

<CheckBox Name="chkDefault" IsChecked="{Binding UseDefault}" />
<ComboBox IsEnabled="{Binding EnableComboBox}}" SelectedItem="{Binding SelectedComboItem}">
    <ComboBoxItem Content="No" />
    <ComboBoxItem Content="Yes" />
</ComboBox>

然后在您的视图模型中,您有UseDefaultEnableComboBoxSelectedComboItem属性,这些属性可以清楚地说明行为应该是什么。

此外,通过在视图模型中执行此操作,您可以使行为单元可测试。 :)

答案 1 :(得分:0)

我会在viewmodel中控制它的逻辑,而不是试图通过绑定来暗示逻辑。 View应该只关心你将组合框选择绑定到后备数据成员(双向),并且复选框的值也绑定了。

    public bool IsOverrideProperty
    {
        get { return _IsOverrideProperty; }
        set
        {
            if (_IsOverrideProperty != value)
            {
                _IsOverrideProperty = value;

                if (_IsOverrideProperty)
                    Selection = Options[0];

                base.OnPropertyChanged("IsOverrideProperty");
            }
        }
    }

    bool _IsOverrideProperty;

    public string Selection
    {
        get { return _Selection; }
        set
        {
            if (_Selection != value)
            {
                _Selection = value;

                base.OnPropertyChanged("Selection");
            }
        }
    }

    string _Selection;

    public string[] Options = new[] { "Yes", "No" };

观点:

<CheckBox IsChecked="{Binding IsOverrideProperty}" />
<ComboBox IsEnabled="{Binding IsOverrideProperty, Converter={StaticResource InverseBooleanConverter}}"
          SelectedValue="{Binding Selection}" ItemsSource="{Binding Options}">
</ComboBox>

选项可以在一个可观察的集合中,但这可能正常。