如何从用户控件修改绑定的可观察集合(如果数据上下文来自宿主窗口)

本文关键字:上下文 数据 如果 窗口 宿主 集合 观察 用户 控件 修改 绑定 | 更新日期: 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);
}