如何使用模板选择器将数据绑定到用户控件

时间:2011-08-11 14:54:33

标签: c# wpf xaml data-binding

我在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;
        }
     }
}

2 个答案:

答案 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的内容