从MainWindow调用UserControl中的事件

时间:2013-04-18 23:59:26

标签: c# listview mvvm user-controls

我有一个带有Button和ListView的UserControl。

模型

public class Item
{
    private string _name = string.Empty;

    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }
}

视图模型

public class ViewModel : NotifyProperty
{
    private Command addCommand;
    public ICommand AddCommand
    {
        get
        {
            if (addCommand == null)
                addCommand = new Command(addItem);
            return addCommand;
        }
    }

    private ObservableCollection<Item> _itemCollection;

    public ViewModel()
    {

        ItemCollection = new ObservableCollection<Item>();
        Item newItem = new Item();
        newItem.Name = "Joe";
        ItemCollection.Add(newItem);
    }

    public ObservableCollection<Item> ItemCollection
    {
        get
        {
            return _itemCollection;
        }
        set
        {
            _itemCollection = value;
            OnPropertyChanged("ItemCollection");
        }
    }

    private void addItem(Object obj)
    {
        Item newItem = new Item();
        newItem.Name = "Chris";
        ItemCollection.Add(newItem);
    }
}

UserControl(XAML)

<UserControl.DataContext>
    <local:ViewModel />
</UserControl.DataContext>

<UserControl.Resources>
    <DataTemplate x:Key="ItemTemplate">
        <StackPanel Orientation="Vertical">
            <Label Content="{Binding Name}" />
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <DockPanel>
        <Button Width="100" Height="30" Content="Add" Command="{Binding AddCommand}" DockPanel.Dock="Top" />
        <ListView ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding ItemCollection}" />
    </DockPanel>
</Grid>

然后我将其添加到我的MainWindow中,如此

 public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        this.mainContentControl.Content = new ListControl();

    }
}

这很好用,当我点击“添加”按钮时,名称“Chris”会被添加到ListView中。

现在我向MainView添加一个按钮,并将其Command属性绑定到我的ViewModel,如下所示:

<Grid>
    <DockPanel>
        <Button Width="100" Height="30" Content="Add" Command="{Binding AddCommand}" DockPanel.Dock="Top">
            <Button.DataContext>
                <local:ViewModel />
            </Button.DataContext>
        </Button>
        <ContentControl x:Name="mainContentControl" />
    </DockPanel>       
</Grid>

当我在MainWindow中单击此按钮时,命令被发送到ViewModel,addItem事件被调用,名称“Chris”被添加到ItemCollection,但ListView不会更新。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的ViewModel是否被设置为其他元素的数据上下文(在XAML或代码隐藏中)。

如果您将其设置为针对按钮的数据上下文,那么将实例化视图模型的新实例,因此与按钮有权访问的实例的任何交互都不会在其他实例中更新。

该按钮将从祖先元素(例如窗口等)继承数据上下文,因此您不需要设置它,但如果您确实需要单独的按钮数据上下文,那么我建议创建ViewModel的实例作为资源,然后仅引用需要访问它的元素。