C# 如果DataContext来自宿主窗口,如何从UserControl修改绑定的ObservableCollection?

C# 如果DataContext来自宿主窗口,如何从UserControl修改绑定的ObservableCollection?,c#,wpf,mvvm,user-controls,observablecollection,C#,Wpf,Mvvm,User Controls,Observablecollection,使用WPF,MVVM。我有一个控件ModifyZooControl,它是一个用户控件。这是一个控件,因为我想将其添加到多个窗口 其中一个窗口是ModifyZooWindow,它从MVVMLight获取数据上下文。 我在窗口的xaml中添加用户控件: <uc:ModifyZooControl/> ModifyZooControl具有以下功能,用于列出Zoo实例的ObservableCollection Animals属性: <ListBox Name="Animal

使用WPF,MVVM。我有一个控件ModifyZooControl,它是一个用户控件。这是一个控件,因为我想将其添加到多个窗口

其中一个窗口是ModifyZooWindow,它从MVVMLight获取数据上下文。 我在窗口的xaml中添加用户控件:

<uc:ModifyZooControl/>

ModifyZooControl具有以下功能,用于列出Zoo实例的
ObservableCollection Animals
属性:

    <ListBox Name="Animals" ItemsSource="{Binding Animals}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Path=Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

到目前为止,这是可行的,我有一个窗口,里面是ModifyZooControl,列出了动物

接下来,我想修改控件代码隐藏中的动物列表。我该怎么做

Animals.Items.Add(newAnimal)
无法工作,因为“在使用ItemsSource时,操作无效。请改为使用ItemsControl.ItemsSource访问和修改元素”

如何从UserControl的codebehind获取原始viewmodel动物可观察集合

据我所知,一种选择是将ObservableCollections的两个属性添加到UserControl。并在从窗口实例化UserControl时设置其值。然后我将引用原始的ObservableCollections,并可以修改它们。 但是,考虑到已经通过窗口的datacontext对集合进行了某种引用,真的需要这样做吗

另外,用户控件是这种事情的正确选择吗?我应该使用框架,还是其他什么

如何从UserControl的codebehind获取原始viewmodel动物可观察集合

您通常不会这样做。一般来说,将需要它作为命令的“命令”绑定是一种更好的方法,因此逻辑可以保留在ViewModel中。ViewModel应该是将新的
Animal
实例添加到它自己的集合中的模型

如果出于某种原因必须执行此操作,则可以强制转换数据上下文:

// In code behind:
Zoo vm = this.DataContext as Zoo;
if (vm != null)
{
    ObservableCollection<Animal> items = vm.Animals;
    items.Add(newAnimal);
}
//在代码隐藏中:
Zoo vm=this.DataContext作为Zoo;
if(vm!=null)
{
可观察收集项目=虚拟动物;
项目。添加(新动物);
}