C# 如何将WPF复选框绑定到条件?
查看模型C# 如何将WPF复选框绑定到条件?,c#,wpf,xaml,binding,conditional,C#,Wpf,Xaml,Binding,Conditional,查看模型 public class MyViewModel { public string MyProperty { get; set; } } XAML <CheckBox IsChecked="{Binding !MyProperty.Equals('Steve')}" /> 这可能吗?怎么做 很多人都会建议使用一种转换器,它肯定能工作。但我发现一个更快的方法是创建一个新的bool属性来使用并绑定到它: public string MyProperty{get;s
public class MyViewModel
{
public string MyProperty { get; set; }
}
XAML
<CheckBox IsChecked="{Binding !MyProperty.Equals('Steve')}" />
这可能吗?怎么做 很多人都会建议使用一种转换器,它肯定能工作。但我发现一个更快的方法是创建一个新的bool属性来使用并绑定到它:
public string MyProperty{get;set;}
public bool MyPropertyChecked
{
get { return !MyProperty.Equals('Steve')}
}
很多人都会建议使用一种转换器,它肯定能工作。但我发现一个更快的方法是创建一个新的bool属性来使用并绑定到它:
public string MyProperty{get;set;}
public bool MyPropertyChecked
{
get { return !MyProperty.Equals('Steve')}
}
这种事情可以在Xaml中完成(很多人说应该这样做),而不需要涉及视图模型的逻辑。若要查看其工作情况,请创建如下视图模型
public class ViewModel : INotifyPropertyChanged
{
private string _myProperty;
public string MyProperty
{
[DebuggerStepThrough]
get { return _myProperty; }
[DebuggerStepThrough]
set
{
if (value != _myProperty)
{
_myProperty = value;
OnPropertyChanged("MyProperty");
}
}
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
<Grid>
<CheckBox Content="Some check box">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding MyProperty}" Value="Steve">
<Setter Property="IsChecked" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
</Grid>
然后将它绑定到某个Xaml上,看起来像这样
public class ViewModel : INotifyPropertyChanged
{
private string _myProperty;
public string MyProperty
{
[DebuggerStepThrough]
get { return _myProperty; }
[DebuggerStepThrough]
set
{
if (value != _myProperty)
{
_myProperty = value;
OnPropertyChanged("MyProperty");
}
}
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
<Grid>
<CheckBox Content="Some check box">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding MyProperty}" Value="Steve">
<Setter Property="IsChecked" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
</Grid>
这是一个标准的WPF复选框,已使用数据触发器设置样式。每当“MyProperty”属性包含“Steve”时,触发器将IsChecked属性设置为true。否则CB将被取消选中(根据样式中的覆盖Setter)。它之所以有效,是因为触发器侦听VM的“MyProperty”中的更改。因此,可视化完全属于用户界面
触发器可以组合(甚至与模板选择器一起使用)来访问WPF内置的强大功能;它们将绑定到复选框上的任何依赖属性,如背景颜色等。这种事情可以在Xaml中完成(许多人说应该这样做),而不涉及视图模型的逻辑。若要查看其工作情况,请创建如下视图模型
public class ViewModel : INotifyPropertyChanged
{
private string _myProperty;
public string MyProperty
{
[DebuggerStepThrough]
get { return _myProperty; }
[DebuggerStepThrough]
set
{
if (value != _myProperty)
{
_myProperty = value;
OnPropertyChanged("MyProperty");
}
}
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
<Grid>
<CheckBox Content="Some check box">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding MyProperty}" Value="Steve">
<Setter Property="IsChecked" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
</Grid>
然后将它绑定到某个Xaml上,看起来像这样
public class ViewModel : INotifyPropertyChanged
{
private string _myProperty;
public string MyProperty
{
[DebuggerStepThrough]
get { return _myProperty; }
[DebuggerStepThrough]
set
{
if (value != _myProperty)
{
_myProperty = value;
OnPropertyChanged("MyProperty");
}
}
}
#region INotifyPropertyChanged Implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
<Grid>
<CheckBox Content="Some check box">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding MyProperty}" Value="Steve">
<Setter Property="IsChecked" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
</Grid>
这是一个标准的WPF复选框,已使用数据触发器设置样式。每当“MyProperty”属性包含“Steve”时,触发器将IsChecked属性设置为true。否则CB将被取消选中(根据样式中的覆盖Setter)。它之所以有效,是因为触发器侦听VM的“MyProperty”中的更改。因此,可视化完全属于用户界面
触发器可以组合(甚至与模板选择器一起使用)来访问WPF内置的强大功能;它们将绑定到复选框上的任何依赖项属性,如背景色等。您可以使用转换器来实现这一点,完全可以在Xaml中完成,无需代码。@GarryVass,这让我相信存在解决方案。@ShaunLuttin,我认为在Xaml中使用它更好,因为它使代码更不杂乱,更抽象…@ShaunLuttin,我添加了一个使用触发器的答案,这不是一个解决方法。看看这是否对你更有效。你可以使用一个转换器来实现这一点,它完全可以在Xaml中完成,而无需代码。@GarryVass这让我相信有一个解决方案存在。@ShaunLuttin,我认为在Xaml中完成它更好,因为它使代码更不杂乱,更抽象。@ShaunLuttin,我添加了一个答案,它使用的触发器不是一个解决方法。看看这对你是否更有效。这就是我最后做的。诀窍是使用
base.PropertyChanged(“MyProperty”)代码>因此UI反映了更改。但这是另一个问题,它必须是双向绑定才能保留复选框的状态。因此,我为MyPropertyChecked添加了一个set属性。这就是我最终要做的。诀窍是使用base.PropertyChanged(“MyProperty”)代码>因此UI反映了更改。但这是另一个问题,它必须是双向绑定才能保留复选框的状态。因此,我为MyPropertyChecked.ok添加了一个set属性。这是有道理的。奇怪的是,我们如何使用元素来定义逻辑。“这似乎有悖常理。”ShaunLuttin,你必须和WPF的祖先们一起讨论这个问题。希望答案有帮助。很多代码是非直观的。我刚刚在我的代码中检查了你的答案,它工作得很好。我甚至检查了枚举相等性。谢谢,好的。这是有道理的。奇怪的是,我们如何使用元素来定义逻辑。“这似乎有悖常理。”ShaunLuttin,你必须和WPF的祖先们一起讨论这个问题。希望答案有帮助。很多代码是非直观的。我刚刚在我的代码中检查了你的答案,它工作得很好。我甚至检查了枚举相等性。谢谢