2

使用 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 的代码隐藏中获取原始视图模型 Animals observablecollection?

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

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

4

1 回答 1

3

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

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

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

// In code behind:
Zoo vm = this.DataContext as Zoo;
if (vm != null)
{
    ObservableCollection<Animal> items = vm.Animals;
    items.Add(newAnimal);
}
于 2013-10-07T16:49:01.610 回答