【发布时间】:2012-08-21 14:29:46
【问题描述】:
我在后面的代码中动态创建 WPF 元素,对于 Grid 中的每一行,我正在构建它由一个 CheckBox 和一个动态编号 TextBoxes 组成。需要的交互如下:
- 如果一行中的所有
TextBoxes的值为0,则设置CheckBoxIsChecked属性到true并禁用它。 - 如果
TextBoxes之一从0更改,请启用CheckBox并将IsChecked设置为false。 - 如果用户点击
CheckBox,设置所有关联的TextBoxes到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 属性。
是否可以使用一两个多重绑定转换器来完成上述所有任务?我真的很想避免为了做到这一点而不得不创建一大堆事件并维护它们。
【问题讨论】:
-
您在代码中创建控件是否有特定原因?
-
您使用的是 MVVM 设计模式吗?这将是在您的数据项中完成的非常简单的逻辑,而不是使用转换器来使您的 UI 完成您想要的。如果您不使用 MVVM,最好只处理
CheckBox.Click和TextBox.TextChanged事件并调整后面代码中其他对象的值。您应该只需要两个事件,一个用于所有CheckBoxes,一个用于所有TextBoxes。两者都只能影响与更改的项目共享相同Grid.Row的项目。 -
@DanielHilgarth 一切都是动态创建的,所以我所有的 UserControls xaml 只代表一个实例。
标签: c# wpf dynamic-binding