如果我的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");
}
}
}
答案 0 :(得分:1)
您正在描述您希望视图具有的逻辑。至少对我来说,这通常意味着这种逻辑属于视图模型。
但是,我不会像你那样做绑定。我会用这样的东西:
<CheckBox Name="chkDefault" IsChecked="{Binding UseDefault}" />
<ComboBox IsEnabled="{Binding EnableComboBox}}" SelectedItem="{Binding SelectedComboItem}">
<ComboBoxItem Content="No" />
<ComboBoxItem Content="Yes" />
</ComboBox>
然后在您的视图模型中,您有UseDefault
,EnableComboBox
和SelectedComboItem
属性,这些属性可以清楚地说明行为应该是什么。
此外,通过在视图模型中执行此操作,您可以使行为单元可测试。 :)
答案 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>
选项可以在一个可观察的集合中,但这可能正常。