- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在创建一些附加属性,其中之一是 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/
我是一名优秀的程序员,十分优秀!