2012-03-29 90 views
0

我已經有這個問題,但我不記得如何解決它。 (我認爲它與wpf中的contextMenu的可視化樹或datacontext有關)ContextMenu命令綁定不刷新

我有一個帶有Combobox和ContentPresenter的ParentViewModel。 ChildViewModel的組合框顯示列表。當選擇一個時,它將使用contentpresenter顯示。

ChildViewModel有一個命令在列表中添加項目。該命令的作用是查找它是否綁定在一個按鈕上,但是當它使用contextMenu完成時,該命令在第一次執行時綁定,但如果ChildViewModel發生更改(在組合框中選擇另一個視圖模型時),則該命令不會更改。該項目被添加到先前選擇的ChildViewModel中。

我該如何解決這個問題?

家長視圖模型:

public class Test1ViewModel:ObservableObject 
{ 
    public Test1ViewModel() 
    { 
     ViewModels = new ObservableCollection<TestViewModel>(); 
     ViewModels.Add(new TestViewModel("View model1")); 
     ViewModels.Add(new TestViewModel("View model2")); 
     SelectedViewModel = ViewModels.FirstOrDefault(); 
    } 

    private TestViewModel _selectedViewModel; 
    public TestViewModel SelectedViewModel 
    { 
     get { return _selectedViewModel; } 
     set 
     { 
      _selectedViewModel = value; 
      RaisePropertyChanged(() => SelectedViewModel); 
     } 
    } 

    public ObservableCollection<TestViewModel> ViewModels { get; set; } 
} 

父視圖:

<StackPanel> 
    <ComboBox ItemsSource="{Binding ViewModels}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedViewModel}"></ComboBox> 
    <ContentPresenter Content="{Binding SelectedViewModel}"/> 
</StackPanel> 

的兒童視圖模型:

public class TestViewModel : ObservableObject 
{ 
    private int _idx; 
    public TestViewModel(string vmName) 
    { 
     Name = vmName; 
     ListOfValues = new ObservableCollection<string>(); 
     ListOfValues.Add("Value" + _idx++); 
     ListOfValues.Add("Value" + _idx++); 
     AddItemCommand = new DelegateCommand(() => ListOfValues.Add("Value" + _idx++)); 
    } 

    public string Name { get; private set; } 

    public ObservableCollection<string> ListOfValues { get; set; } 

    public DelegateCommand AddItemCommand { get; private set; } 
} 

子視圖

<StackPanel> 
<Button Content="AddValue" Command="{Binding AddItemCommand}"/> <!--Binding work when selected view model is changed--> 
<TextBlock Text="{Binding Name}"/> 
<ListBox ItemsSource="{Binding ListOfValues}"> 
    <ListBox.ContextMenu> 
    <ContextMenu> 
     <MenuItem Header="AddValue" Command="{Binding AddItemCommand}"/> <!--Binding doesn't work when selected view model is changed--> 
    </ContextMenu> 
    </ListBox.ContextMenu> 
</ListBox> 

在此先感謝

回答