从MainView与ViewModel通信

时间:2013-04-17 22:32:14

标签: c# listview mvvm

我是MVVM的新手并且仍然试图掌握它,所以如果我设置错误请告诉我。我所拥有的是一个带有ListView的UserControl。我使用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)
    {

    }
}

MainWindow(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事件中执行此操作?

同样,如果我这样做,那就错了,让我知道并指出我正确的方向。感谢

1 个答案:

答案 0 :(得分:2)

您不应直接与控件进行交互。

您需要做的是定义一个Command(一个实现ICommand接口的类)并在ViewModel上定义此命令。

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

此链接应提供更多信息:

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