C# · 12月 22, 2021

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

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

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

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

Binding setscoreToZeroIfIsNormalChecked = new Binding(“IsChecked”); setscoreToZeroIfIsNormalChecked.source = this.NormalCheck@R_278_2419@Control; setscoreToZeroIfIsNormalChecked.Converter = m_NormalCheck@R_278_2419@JointscoresConverter; 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; } }

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

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

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

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

MultiBinding multiBinding = new MultiBinding(); multiBinding.Converter = multiBindingConverter; multiBinding.Bindings.Add(new Binding(“Text”) { Source = txt@R_278_2419@1}); multiBinding.Bindings.Add(new Binding(“Text”) { Source = txt@R_278_2419@2}); multiBinding.NotifyOnSourceUpdated = true;//this is important. check@R_278_2419@.SetBinding(Check@R_278_2419@.IsCheckedProperty,multiBinding);

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

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

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

所以,制作一个新的MultiBinding.

MultiBinding multiBinding = new MultiBinding(); multiBinding.Converter = text@R_278_2419@MultiBindingConverter; multiBinding.Bindings.Add(new Binding(“IsChecked”) { Source = check@R_278_2419@1}); multiBinding.Bindings.Add(new Binding(“Text”) { Source = text@R_278_2419@1}); multiBinding.NotifyOnSourceUpdated = true;//this is important. text@R_278_2419@1.SetBinding(Text@R_278_2419@.Text,multiBinding);

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