【问题标题】:How to bind a WPF CheckBox to a conditional?如何将 WPF CheckBox 绑定到条件?
【发布时间】:2014-06-03 09:04:02
【问题描述】:

查看模型

public class MyViewModel
{
    public string MyProperty { get; set; }
}

XAML

<CheckBox IsChecked="{Binding !MyProperty.Equals('Steve')}" />

这可能吗?如何?

【问题讨论】:

  • 你可以使用转换器
  • 这可以完全在 Xaml 中完成,无需代码。
  • @GarryVass 这让我相信存在解决方案。
  • @ShaunLuttin,我认为在 Xaml 中执行此操作更好,因为它使代码不那么混乱,更抽象...
  • @ShaunLuttin,我添加了一个使用不是解决方法的触发器的答案。看看这是否更适合你。

标签: c# wpf xaml binding conditional


【解决方案1】:

这种事情可以在 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
}

然后将它绑定到一些看起来像这样的 Xaml...

<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 将被取消选中(根据样式中的覆盖设置器)。它之所以起作用,是因为触发器会侦听 VM 的“MyProperty”中的更改。所以可视化完全归于用户界面。

触发器可以组合(甚至与模板选择器一起使用)来访问 WPF 内置的强大功能;它们将绑定到复选框上的任何依赖属性,例如背景颜色等。

【讨论】:

  • 好的。这是有道理的。奇怪的是我们如何使用
  • @ShaunLuttin,您将不得不与 WPF 的前辈们一起讨论这个问题。希望答案有帮助
  • 完全。许多代码是不直观的。我刚刚在我的代码中检查了你的答案,它运行良好。我什至检查了枚举相等性。谢谢。
【解决方案2】:

很多人会推荐一个转换器,它确实有效。但我发现一个更快的方法是创建一个新的 bool 属性来使用并绑定到它:

public string MyProperty{get;set;}

public bool MyPropertyChecked
{
    get { return !MyProperty.Equals('Steve')}
}

【讨论】:

  • 这就是我最终要做的。诀窍是使用base.PropertyChanged("MyProperty"); 进行设置,以便用户界面反映更改。不过,这是另一个问题。
  • 必须是双向绑定才能保留复选框的状态。因此,我为 MyPropertyChecked 添加了一个 set 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多