如何使用模板选择器将数据绑定到用户控件
本文关键字:数据绑定 用户 控件 选择器 何使用 | 更新日期: 2023-09-27 18:05:09
我在WPF中使用数据网格模板选择器。
我得到了这个代码:
<l:ProblemTemplateSelector x:Key="problemTemplateSelector">
<l:ProblemTemplateSelector.ArithmeticTemplate>
<DataTemplate>
<Grid Background="LightBlue">
<l:ArithmeticUserControl Problem="{Binding ElementName=this}" />
</Grid>
</DataTemplate>
</l:ProblemTemplateSelector.ArithmeticTemplate>
</l:ProblemTemplateSelector>
在usercontrol中,我需要在Problem属性中设置所有元素,但我不知道我做错了什么。谢谢。
更新1:如果你需要更详细的信息,我将更具体,我有一个类练习,其中是一个用户控件:
public class Exercise : UserControl
{
public static readonly DependencyProperty ProblemProperty = DependencyProperty.Register(
"Problem", typeof(Problem), typeof(Exercise), new PropertyMetadata(null, ));
public virtual Problem Problem
{
get
{
return (Problem)GetValue(ProblemProperty);
}
set
{
SetValue(ProblemProperty, value);
}
}
}
我有另一个类,它是从练习中派生出来的。
public partial class ArithmeticUserControl : Exercise
{
public ArithmeticUserControl()
{
InitializeComponent();
}
public override Problem Problem
{
get
{
return base.Problem;
}
set
{
base.Problem = value;
Arithmetic p = (Arithmetic)value;
Number1 = p.Number1;
Number2 = p.Number2;
Operator = p.Operation;
}
}
}
您应该能够将绑定声明为"{Binding}"
,并让它将Problem
属性绑定到数据项。
EDIT:看到你的例子后,你需要改变你如何处理Problem
属性。WPF绑定系统不使用CLR属性,因此CLR属性只存在以方便用户代码。因此,当通过绑定设置值时,属性中的代码永远不会被执行。
相反,您需要通过覆盖OnPropertyChanged
来处理属性值的更改。例如,在继承的类中:
protected override OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
if(e.Property == ProblemProperty)
{
Arithmetic p = (Arithmetic)Problem;
Number1 = p.Number1;
Number2 = p.Number2;
Operator = p.Operation;
}
}
简单地使用{Binding}
来传递控件中的数据项。如果这没有帮助,随着你的控件添加一个TextBlock,看看它通过直接绑定绑定:
<Grid Background="LightBlue">
<l:ArithmeticUserControl Problem="{Binding ElementName=this}" />
<TextBlock Text="{Binding}" Background="Green" ></TextBlock>
</Grid>
在绿色背景下可以看到ListBoxItem