繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM