![](/img/trans.png)
[英]Null Reference Exception being thrown when using a data template selector in a user control WPF
[英]How to bind data to a user control using template selector
我在 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>
在用户控件中,我需要在问题属性中设置所有元素,但我不知道我做错了什么。 谢谢。
更新 1:
如果您需要详细信息,我会更具体,我有一个 class 练习,用户控件在哪里:
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);
}
}
}
这我有另一个 class 来自练习。
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
属性绑定到数据项。
编辑:看到您的示例后,您需要更改处理Problem
属性的方式。 WPF 绑定系统不使用 CLR 属性,因此 CLR 属性的存在只是为了方便用户代码。 因此,当通过绑定设置值时,您的属性中的代码永远不会被执行。
相反,您需要通过覆盖OnPropertyChanged
来处理属性值更改。 例如,在您继承的 class 中:
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 有什么
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.