自定义依赖属性在具有 TemplatedParent 的 UWP 模板中不起作用

Posted

技术标签:

【中文标题】自定义依赖属性在具有 TemplatedParent 的 UWP 模板中不起作用【英文标题】:Custom dependency property not working in UWP template with TemplatedParent 【发布时间】:2017-02-07 09:37:42 【问题描述】:

我有以下数据模板:

 <DataTemplate x:Key="ListViewItemTemplate">
        <Grid x:Name="grid">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0"
                       Margin="5"
                       Foreground="Black"
                       Text="Binding ActualText"
                       TextWrapping="WrapWholeWords" />                
            <my:CustomSelector Grid.Column="1"
                                         ActualValue="Binding Value, Mode=TwoWay,
                                                                 RelativeSource=RelativeSource TemplatedParent" />
            <ComboBox x:Name="cbox"
                      Grid.Column="2"
                      Width="90"
                      Margin="3"
                      VerticalAlignment="Center"
                      ItemsSource="StaticResource data"
                      SelectedIndex="Binding Value,
                                              Mode=TwoWay" />

        </Grid>
    </DataTemplate>

这是它的代码隐藏文件:

public sealed partial class CustomSelector : StackPanel
  
    public int ActualValue
    
      get  return (int)GetValue(ActualValueProperty); 
      set  SetValue(ActualValueProperty, value); 
    

    // Using a DependencyProperty as the backing store for ActualValue.  This enables animation, styling, binding, etc...
    public static readonly DependencyPropertyActualValueProperty =
        DependencyProperty.Register("ActualValue", typeof(int), typeof(CustomSelector), new PropertyMetadata(0, (x, y) =>
        
          CustomSelector cc = x as CustomSelector;
          int content = (int)y.NewValue;
          cc.ActualValue = content;
        ));


    public CustomSelector()
    
      this.InitializeComponent();
      DataContext = this;
     
  

TextBlockComboBox 中的绑定工作正常,因此 DataContext 是正确的。

我了解到模板中的自定义绑定只有在 RelativeSource 设置为 TemplatedParent 时才有效。

不幸的是,我的自定义控件的 ActualValue 属性始终设置为默认值(这显然是错误的),当我更改值时,它总是从 0 开始。

对此我还能做些什么?

【问题讨论】:

【参考方案1】:

我犯了一个错误并覆盖了我的自定义控件的 DataContext,因此它无法在其上下文中找到 Value 属性。

所以,我删除了以下行:

 DataContext = this;

现在它可以按预期工作了。

【讨论】:

以上是关于自定义依赖属性在具有 TemplatedParent 的 UWP 模板中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何定义具有潜在子元素和属性的属性的自定义 web.config 部分?

依赖属性

Wpf:通用集合依赖属性

使用依赖属性在自定义类中设置属性

使用 ControlTemplate 在用户控件上绑定自定义依赖属性

在 CMake 中具有依赖关系的自定义对象