从主视图与ViewModel通信

本文关键字:通信 ViewModel 主视图 | 更新日期: 2023-09-27 18:09:49

我是MVVM的新手,仍然试图掌握它,所以如果我设置错了,请告诉我。我有一个UserControl,里面有一个ListView。我用ViewModel的数据填充这个ListView,然后将控件添加到我的MainView。在我的MainView上,我有一个按钮,我想用它来添加一个项目到ListView。以下是我的文件:

模型
public class Item
{
    public string Name { get; set; }
    public Item(string name)
    {
        Name = name;
    }
}

视图模型

public class ViewModel : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
    private ObservableCollection<Item> _itemCollection;
    public ViewModel()
    {
        ItemCollection = new ObservableCollection<Item>()
        {
            new Item("One"),
            new Item("Two"),
            new Item("Three"),
            new Item("Four"),
            new Item("Five"),
            new Item("Six"),
            new Item("Seven")
        };
    }
    public ObservableCollection<Item> ItemCollection
    {
        get
        {
            return _itemCollection;
        }
        set
        {
            _itemCollection = value;
            OnPropertyChanged("ItemCollection");
        }
    }
}

视图(XAML)

<UserControl.Resources>
    <DataTemplate x:Key="ItemTemplate">
        <StackPanel Orientation="Vertical">
            <Label Content="{Binding Name}" />
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>
<UserControl.DataContext>
    <local:ViewModel />
</UserControl.DataContext>
<Grid>
    <ListView ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding ItemCollection}">
    </ListView>
</Grid>

主窗口

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.mainContentControl.Content = new ListControl();
    }
    private void Button_Add(object sender, RoutedEventArgs e)
    {
    }
}

主窗口(XAML)

<Grid>
    <DockPanel>
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
            <Button Width="100" Height="30" Content="Add" Click="Button_Add" />
        </StackPanel>
        <ContentControl x:Name="mainContentControl" />
    </DockPanel>
</Grid>

现在,从我的理解,我应该能够只是一个项目到ItemCollection,它将在视图中更新。我如何做到这一点,从Button_Add事件?

再次强调,如果我做错了,请让我知道并指出正确的方向。由于

从主视图与ViewModel通信

你不应该直接与控件交互

你需要做的是定义一个Command(一个实现iccommand接口的类),并在ViewModel上定义这个命令。

然后将Button的command属性绑定到ViewModel的这个属性。在ViewModel中,您可以执行命令并直接向列表中添加项目(因此,listview将通过自动数据绑定得到更新)。

此链接应提供更多信息:

http://msdn.microsoft.com/en-us/library/gg405484 (v = pandp.40) . aspx # sec11