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

本文关键字:数据绑定 用户 控件 选择器 何使用 | 更新日期: 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