gpt4 book ai didi

c# - DataContext 更改并不总是导致来自 DataTemplate.LoadContent 的类的绑定(bind)更新

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:11 25 4
gpt4 key购买 nike

我正在创建一些附加属性,其中之一是 DataTemplate。 DataTemplate 应该有一个我创建的 FrameworkElement 在其中定义,这样所有这些的 XAML 声明如下所示:

<SomeControl m:ItemsSource="{Binding Source}">
<m:MyTemplate>
<DataTemplate>
<m:MyClass SomeDependency="{Binding Path}"/>
</DataTemplate>
</m:MyTemplate>
</SomeControl>

在 MyTemplateProperty 更改回调的代码中,它遍历 Source 中的每个项目并调用 DataTemplate 上的 LoadContent()。然后它将 LoadContent() 返回的类上的 DataContext 设置为来自 Source 的项目:

private static void MyTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var items = (d as SomeControl).GetValue(ItemsSourceProperty) as IList;
var template = e.NewValue as DataTemplate;
foreach(var item in items)
{
var myClass = template.LoadContent() as MyClass;
myClass.DataContext = item;
}
}

奇怪的是,以这种方式创建的 MyClass 的第一个实例获得绑定(bind)更新(SomeDependencyProperty 更新为来自 ItemsSource 的项目中的值),但其余实例均未更新。

我已经通过自己创建 MyClass 而不是 LoadContent 调用并使用 BindingOperation.SetBinding 设置绑定(bind)来验证这应该正常工作,例如:

foreach(var item in items)
{
var myClass = new MyClass();
BindingOperations.SetBinding(myClass, MyClass.SomeDependencyProperty, new Binding("Path");
myClass.DataContext = item;
}

有谁知道为什么 LoadContent 调用似乎生成的对象在 DataContext 更改时并不全部更新其绑定(bind)? LoadContent 调用与仅自己创建对象有何不同?

最佳答案

一位同事指出,没有任何东西保留在 MyClass 的实例上。添加一种引用这些实例的方法解决了我所看到的问题。它并不能完全解释为什么第一个实例会获得更新而其余实例不会,但它解决了我的问题。

关于c# - DataContext 更改并不总是导致来自 DataTemplate.LoadContent 的类的绑定(bind)更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com