2013-04-18 70 views
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不會更新。我究竟做錯了什麼?

回答

0

您的ViewModel被設置爲另一個元素的數據上下文(在XAML或代碼隱藏中)。

如果您將它設置爲針對按鈕的數據上下文,它將實例化視圖模型的新實例,因此與按鈕有權訪問的實例的任何交互都不會在其他實例中更新。

該按鈕將繼承祖先元素(如窗口等)的數據上下文,所以你不需要設置它,但如果你確實需要一個單獨的數據上下文的按鈕,那麼我建議創建作爲資源的ViewModel的實例,然後僅爲需要訪問它的元素引用該實例。

+1

是的,我將ViewModel設置爲我的UserControl XAML中的DataContext。我刪除了它,並將其設置在MainWindow XAML的窗口元素中,它工作正常!你也可以在後面的代碼中設置它:DataContext = new ViewModel();我假設它以同樣的方式做。所以,現在我已經完成了這個工作,我應該可以從其他UserControls中添加到MainWindow中的ViewModel,對嗎? – Chris

+0

@Chris yep!只要UserControl(或任何其他元素)放置在另一箇中,它就繼承父級的數據控制 - 此規則的例外是列表框中的項目模板,並且這樣,他們將datacontext設置爲邊界中的實際對象他們代表的集合。 – Clint

相關問題