我在后面的代码中动态创建
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可以修改它.
原因很简单,这是一个双向属性.所以要么你可以修改它,要么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”.