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

时间:2016-09-29 07:21:45

标签: uwp xamarin.uwp

我有以下DataTemplate:

 <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 个答案:

答案 0 :(得分:0)

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

所以,我删除了以下行:

 DataContext = this;

现在它按预期工作。