c# – Code背后的动态多绑定

我在后面的代码中动态创建 WPF元素,对于我构建的Grid中的每一行,它由CheckBox和DynamicBoxes组成.需要的交互如下:

>如果一行中的所有TextBox都具有值0,请设置CheckBox
IsChecked属性为true并禁用它.
>如果其中一个TextBox随后从0更改,则启用
CheckBox并将IsChecked设置为false.
>如果用户单击CheckBox,请设置所有关联的TextBox
为0并禁用CheckBox

我能够使用以下代码完成最后一部分的第一部分:

Binding setscoreToZeroIfIsnormalChecked = new Binding("IsChecked");
            setscoreToZeroIfIsnormalChecked.source = this.normalCheckBoxControl;
            setscoreToZeroIfIsnormalChecked.Converter = m_normalCheckBoxJointscoresConverter;
            tempJointscoreControl.JointscoreContainer.SetBinding(ContainerBase.SingleAnswerProperty,setscoreToZeroIfIsnormalChecked);

和转换器:

public object Convert(object value,System.Type targettype,object parameter,System.Globalization.CultureInfo culture)
        {
            if (value is bool && targettype == typeof(Answer))
            {
                if ((bool)value)
                {
                    Answer answer = new Answer();
                    answer.Value = "0";
                    answer.displayValue = "0";
                    return answer;
                }
                else
                    return null;
            }
            else
            {
                return null;
            }
        }

但是,在尝试创建另一个转换器来完成其他功能时,由于所有功能都基于CheckBox.IsChecked属性,因此我遇到了转换器相互踩踏的问题.

无论如何使用一个或两个多重绑定转换器完成上述所有操作?我真的很想避免创建一大堆事件并维护它们以便做到这一点.

解决方法

这相对容易.一切都应该解决CheckBox IsChecked属性.
原因很简单,这是一个双向属性.所以要么你可以修改它,要么CheckBox可以修改它.

那么你做什么,你使用MultiBinding,如下:

MultiBinding multiBinding = new MultiBinding();
    multiBinding.Converter = multiBindingConverter;

    multiBinding.Bindings.Add(new Binding("Text") { Source = txtBox1});
    multiBinding.Bindings.Add(new Binding("Text") { Source = txtBox2});

    multiBinding.NotifyOnSourceUpdated = true;//this is important. 
    checkBox.SetBinding(CheckBox.IsCheckedProperty,multiBinding);

在你的multiBindingConverter中,你将object []值作为第一个参数,你需要将其转换为IList并迭代它并且&&做你的计算,如果你要么返回true / false.(IsChecked = true或false)

现在将CheckBox IsEnabled绑定到CheckBox IsChecked属性,并使用BooleanInverterConverter. (如果选中CheckBox,则应禁用它,反之亦然)

最后一步是让TextBoxes监听CheckBox的实际IsChecked属性.
如果它为TRUE,则它们都应显示0的值,否则它们可以显示它们想要的值.

所以,制作一个新的MultiBinding.

MultiBinding multiBinding = new MultiBinding();
    multiBinding.Converter = textBoxMultiBindingConverter;

    multiBinding.Bindings.Add(new Binding("IsChecked") { Source = checkBox1});
    multiBinding.Bindings.Add(new Binding("Text") { Source = textBox1});

    multiBinding.NotifyOnSourceUpdated = true;//this is important. 
    textBox1.SetBinding(TextBox.Text,multiBinding);

textBoxMultiBindingConverter中的想法是,如果value [0] == FALSE,则返回Text(value [1]);如果value [0] == TRUE,则返回“0”.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...