C# 如果DataContext来自宿主窗口,如何从UserControl修改绑定的ObservableCollection?
使用WPF,MVVM。我有一个控件ModifyZooControl,它是一个用户控件。这是一个控件,因为我想将其添加到多个窗口 其中一个窗口是ModifyZooWindow,它从MVVMLight获取数据上下文。 我在窗口的xaml中添加用户控件: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
<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)
{
可观察收集项目=虚拟动物;
项目。添加(新动物);
}