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

前端之家收集整理的这篇文章主要介绍了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”.

猜你在找的C#相关文章