0
我有一個帶有Button和ListView的UserControl。從MainWindow調用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);
}
}
用戶控件(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>
我那麼像這樣
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.mainContentControl.Content = new ListControl();
}
}
01加入到我的主窗口
這工作正常,當我點擊「添加」按鈕名稱「克里斯」被添加到ListView。
現在我添加一個按鈕MAINVIEW和其命令屬性綁定到我的視圖模型像這樣:
<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>
當我點擊主窗口的命令發送到視圖模型此按鈕,如addItem事件被調用,名稱「Chris」被添加到ItemCollection中,但ListView不會更新。我究竟做錯了什麼?
是的,我將ViewModel設置爲我的UserControl XAML中的DataContext。我刪除了它,並將其設置在MainWindow XAML的窗口元素中,它工作正常!你也可以在後面的代碼中設置它:DataContext = new ViewModel();我假設它以同樣的方式做。所以,現在我已經完成了這個工作,我應該可以從其他UserControls中添加到MainWindow中的ViewModel,對嗎? – Chris
@Chris yep!只要UserControl(或任何其他元素)放置在另一箇中,它就繼承父級的數據控制 - 此規則的例外是列表框中的項目模板,並且這樣,他們將datacontext設置爲邊界中的實際對象他們代表的集合。 – Clint