2012-03-29 62 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> 

在此先感谢

回答