我在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;
}
}
}
答案 0 :(得分:2)
您应该能够将绑定声明为"{Binding}"
,并将Problem
属性绑定到数据项。
编辑:看到您的示例后,您需要更改处理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;
}
}
答案 1 :(得分:1)
只需使用{Binding}
传递控件中的数据项即可。
如果这没有帮助,那么与控件一起添加一个TextBlock,看看通过直接绑定绑定的是什么:
<Grid Background="LightBlue">
<l:ArithmeticUserControl Problem="{Binding ElementName=this}" />
<TextBlock Text="{Binding}" Background="Green" ></TextBlock>
</Grid>
因此,在绿色背景上,您可以看到ListBoxItem的内容