如何从用户控件修改绑定的可观察集合(如果数据上下文来自宿主窗口)
本文关键字:上下文 数据 如果 窗口 宿主 集合 观察 用户 控件 修改 绑定 | 更新日期: 2023-09-27 18:34:20
Using WPF, MVVM.我有一个控件,ModifyZooControl,这是一个UserControl。这是一个控件,因为我想将其添加到多个窗口。
其中一个窗口是 ModifyZooWindow,它从 MVVMLight 获取 DataContext。我在窗口的 xaml 中添加用户控件:
<uc:ModifyZooControl/>
ModifyZooControl 具有以下内容,用于列出 Zoo 实例的 ObservableCollection<Animal> Animals
属性:
<ListBox Name="Animals" ItemsSource="{Binding Animals}">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Path=Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
到目前为止,这很有效,我有窗口,里面有列出动物的 ModifyZooControl。
接下来,我想从控件的代码隐藏中修改动物列表。我该怎么做?
Animals.Items.Add(newAnimal)
不起作用,因为"使用项目源时操作无效。使用 ItemsControl.ItemsSource 访问和修改元素"。
如何从用户控件的代码隐藏访问原始视图模型动物可观察集合?
据我了解,一种选择是将可观察集合的两个属性添加到用户控件中。并在从窗口实例化用户控件时设置其值。然后我会引用原始的 ObservableCollections,并可以修改它们。但是,考虑到已经通过窗口的数据上下文对集合进行了某种引用,这真的需要吗?
另外,用户控件是这种事情的正确选择吗?我应该使用框架还是其他东西?
如何从用户控件的代码隐藏访问原始视图模型动物可观察集合?
您通常不会这样做。 通常,绑定需要此命令作为命令的"命令"通常是一种更好的方法,以便逻辑可以保留在 ViewModel 中。 ViewModel 应该是将新的 Animal
实例添加到其自己的集合中的实例。
如果出于某种原因必须执行此操作,则可以强制转换数据上下文:
// In code behind:
Zoo vm = this.DataContext as Zoo;
if (vm != null)
{
ObservableCollection<Animal> items = vm.Animals;
items.Add(newAnimal);
}