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>
TextBox
和local: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 上的属性在它是附加集合中的项目时不会更新的主要内容,如果未能解决你的问题,请参考以下文章