XAML:DependecyObject 上的属性在它是附加集合中的项目时不会更新

Posted

技术标签:

【中文标题】XAML:DependecyObject 上的属性在它是附加集合中的项目时不会更新【英文标题】:XAML: Property on DependecyObject not updating when it is an item in an attached collection 【发布时间】:2018-08-07 00:46:20 【问题描述】:

我有一个 DependencyObject,它位于附加的依赖属性(这是一个集合)中。由于某种原因,绑定到该对象不起作用。

在我的示例中,我绑定了两个东西,一个基本附加属性 (local:CollHolder.BasicProperty) 和一个常规依赖属性 (local:MyItem.MyData) - 两者都绑定到 TextBox 控件的 Text。 XAML 如下所示:

<ListView ItemsSource="x:Bind Items">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="x:String">
            <StackPanel x:Name="stack" local:CollHolder.BasicProperty="Binding ElementName=text, Path=Text" VerticalAlignment="Center" HorizontalAlignment="Center" >
                <TextBox Text="" x:Name="text"/>
                <local:CollHolder.Coll>
                    <local:MyItem MyData="Binding ElementName=text, Path=Text"/>
                </local:CollHolder.Coll>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Text 属性发生更改时,它们会传播到附加属性,但不会传播到依赖属性。

ColHolder:

public class CollHolder : DependencyObject

    public static readonly DependencyProperty BasicPropertyProperty =
        DependencyProperty.RegisterAttached("BasicProperty", typeof(string), typeof(CollHolder), new PropertyMetadata("", DPC));
    public static readonly DependencyProperty CollProperty =
        DependencyProperty.RegisterAttached("Coll", typeof(Coll), typeof(CollHolder), new PropertyMetadata(null));
    public static Coll GetColl(DependencyObject obj)
    
        var coll = (Coll)obj.GetValue(CollProperty);
        if (coll == null)
        
            obj.SetValue(CollProperty, coll = new Coll());
        

        return coll;
    

    public static void SetColl(DependencyObject obj, Coll value)
    
        obj.SetValue(CollProperty, value);
    


    public static string GetBasicProperty(DependencyObject obj)
    
        return (string)obj.GetValue(BasicPropertyProperty);
    

    public static void SetBasicProperty(DependencyObject obj, string value)
    
        obj.SetValue(BasicPropertyProperty, value);
    


    private static void DPC(DependencyObject d, DependencyPropertyChangedEventArgs e)
    
        Debug.WriteLine("Basic Property changed");
    

我的项目:

public class MyItem : DependencyObject

    public string MyData
    
        get  return (string)GetValue(MyDataProperty); 
        set  SetValue(MyDataProperty, value); 
    

    // Using a DependencyProperty as the backing store for MyData.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyDataProperty =
        DependencyProperty.Register("MyData", typeof(string), typeof(MyItem), new PropertyMetadata("", DPC));



    private static void DPC(DependencyObject d, DependencyPropertyChangedEventArgs e)
    
        Debug.WriteLine("CHANGED!!");
    

而且集合非常简单:

public class Coll : List<MyItem>


【问题讨论】:

【参考方案1】:

当 Text 属性发生更改时,它们会传播到附加属性,但不会传播到依赖属性。

<TextBox Text="" x:Name="text"/>
<local:CollHolder.Coll>
  <local:MyItem MyData="Binding ElementName=text, Path=Text"/>
</local:CollHolder.Coll>

TextBoxlocal:MyItem在同一个DataContext中,可以使用x:Bind 直接获取文本值。

<TextBox Text="x:Bind " x:Name="text" />
<local:CollHolder.Coll>
    <local:MyItem  MyData="x:Bind " />
</local:CollHolder.Coll>

更新

我尝试将MyItem 替换为Control 以测试DependencyProperty 是否在Binding 模式下工作。它按预期工作。因此,您可以使用Control 作为 MyItem 的基类。

public class MyItem : Control
 
     public string MyData
     
         get  return (string)GetValue(MyDataProperty); 
         set  SetValue(MyDataProperty, value); 
     

     // Using a DependencyProperty as the backing store for MyData.  This enables animation, styling, binding, etc...
     public static readonly DependencyProperty MyDataProperty =
         DependencyProperty.Register("MyData", typeof(string), typeof(MyItem), new PropertyMetadata("", DPC));

     private static void DPC(DependencyObject d, DependencyPropertyChangedEventArgs e)
     
         Debug.WriteLine("CHANGED!!");
     
 

【讨论】:

以上是关于XAML:DependecyObject 上的属性在它是附加集合中的项目时不会更新的主要内容,如果未能解决你的问题,请参考以下文章

将 XAML 中的可见性绑定到可见性属性

Xamarin XAML语言教程控件模板的模板绑定

如何从 xaml 访问 UserControl 内的按钮?

Wpf依赖属性动态键向下

XAML序列化 - 需要指定属性

WPF - 从 XAML 中的 StringFormat 绑定属性访问属性值