gpt4 book ai didi

c# - 如果 DataContext 来自托管窗口,如何从 UserControl 修改绑定(bind)的 ObservableCollection?

转载 作者:行者123 更新时间:2023-11-30 22:13:17 25 4
gpt4 key购买 nike

使用 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)不起作用,因为“使用 ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素”。

如何从 UserControl 的代码隐藏中获取原始 View 模型 Animals observablecollection?

据我了解,一种选择是将 ObservableCollections 的两个属性添加到 UserControl。并在从 Window 实例化 UserControl 时设置它们的值。然后我将引用原始的 ObservableCollections,并可以修改它们。但考虑到已经存在某种通过窗口的数据上下文对集合的引用...,这真的需要吗?

另外,UserControl 是这种事情的正确选择吗?我应该使用框架还是其他东西?

最佳答案

How do I reach the original viewmodel Animals observablecollection from the UserControl's codebehind?

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

如果您出于某种原因必须这样做,您可以强制转换数据上下文:

// In code behind:
Zoo vm = this.DataContext as Zoo;
if (vm != null)
{
ObservableCollection<Animal> items = vm.Animals;
items.Add(newAnimal);
}

关于c# - 如果 DataContext 来自托管窗口,如何从 UserControl 修改绑定(bind)的 ObservableCollection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19230256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com