将用户控件绑定到布尔属性的对面

Posted

技术标签:

【中文标题】将用户控件绑定到布尔属性的对面【英文标题】:binding a usercontrol to the opposite of a bool property 【发布时间】:2011-01-28 16:15:28 【问题描述】:

非常简单:我希望与this 一样,但在winforms 中。谷歌似乎提取的所有内容都是 wpf 特定的(即。我不想引用presentationframework.dll)

如果您不想阅读链接,请说明:

以下是我想做的意图的表示,尽管它显然不起作用。

CheckBox1.DataBindings.Add(new Binding("Checked", this.object, "!SomeBool"));

【问题讨论】:

【参考方案1】:

为此,我将在您拥有属性SomeBool 的同一类中创建一个名为NotSomeBool 的只读属性,并改为绑定到该属性。

【讨论】:

这会混淆域对象,为其添加特定于 UI 的行为。 +1 仍然。这是解决问题的方法,而不是我想要的。谢谢。【参考方案2】:

你有两个选择:

    手动创建Binding 对象并附加到FormatParse 事件并交换每个事件中的值。 在类上创建一个额外的属性,它只是反转预期属性的逻辑

第一个选项更简洁,IMO,因为它不会强制您的类的 API 遵循您的 UI 设计,尽管第二个选项(稍微)更容易。

选项 1 示例

private void SwitchBool(object sender, ConvertEventArgs e)
 
    e.Value = !((bool)e.Value);


...

Binding bind = new Binding("Checked", this.object, "SomeBool");

bind.Format += SwitchBool;
bind.Parse += SwitchBool;

CheckBox1.DataBindings.Add(bind);

选项 2 示例

public class SomeClass

    public bool SomeBool  get; set; 

    public bool NotSomeBool
    
        get  return !SomeBool; 
        set  SomeBool = !value; 
    


...

CheckBox1.DataBindings.Add("Checked", this.object, "NotSomeBool");

再一次,我非常喜欢选项 1,因为选项 2 要求您根据 UI 设计定制您的课程。

【讨论】:

我知道选项 2,我可能应该提到我不想将 UI 逻辑放在我的域模型中,这就是我没有使用它的原因。也就是说,我确实成功实施了第一个选项。非常感谢。我想为将来可能会看到这一点的任何人指出:您不能将该绑定添加到多个控件,必须为每个 UI 控件创建一个(这是我想要做的)。 +1 作为第一个选项,我试图解决同样的问题。我实现了一个扩展和一个特定的“BooleanBinding”类,您可以在其中定义是否要根据您的解决方案绑定到相反的对象!我在这里写了一篇博客:codewithpassion.blogspot.com/2010/11/…【参考方案3】:

根据亚当的回答,我写了一个小助手类:

class NegateBinding

    string propertyName;
    object dataSource;
    string dataMember;
    public NegateBinding(string propertyName, object dataSource, string dataMember)
    
        this.propertyName = propertyName;
        this.dataSource = dataSource;
        this.dataMember = dataMember;
    

    public static implicit operator Binding(NegateBinding eb)
    
        var binding = new Binding(eb.propertyName, eb.dataSource, eb.dataMember, false, DataSourceUpdateMode.OnPropertyChanged);
        binding.Parse += new ConvertEventHandler(negate);
        binding.Format += new ConvertEventHandler(negate);
        return binding;
    

    static void negate(object sender, ConvertEventArgs e)
    
        e.Value = !((bool)e.Value);
    

现在你可以像这样使用它了:

label1.DataBindings.Add(new NegateBinding("Visible", otherObject, "HasData"));

【讨论】:

implicit operator的很好的介绍和巧妙的使用。

以上是关于将用户控件绑定到布尔属性的对面的主要内容,如果未能解决你的问题,请参考以下文章

WPF:将静态资源绑定到用户控件中的依赖项属性

当通过网络接收的数据更改属性时,如何将控件绑定到属性更改?

如何正确绑定到 MVVM 框架中用户控件的依赖属性

WPF 自定义用户控件绑定在列表视图中始终返回 false

绑定到用户控件中的依赖属性并在嵌套属性更改时调用 CanExecute

使用属性更改简单绑定到用户控件在 vs 扩展工具窗口中不起作用