我有一个带有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不会更新。我做错了什么?
答案 0 :(得分:0)
您的ViewModel是否被设置为其他元素的数据上下文(在XAML或代码隐藏中)。
如果您将其设置为针对按钮的数据上下文,那么将实例化视图模型的新实例,因此与按钮有权访问的实例的任何交互都不会在其他实例中更新。
该按钮将从祖先元素(例如窗口等)继承数据上下文,因此您不需要设置它,但如果您确实需要单独的按钮数据上下文,那么我建议创建ViewModel
的实例作为资源,然后仅引用需要访问它的元素。