2012-03-29 3 views
0

У меня уже есть эта проблема, но я не могу вспомнить, как ее решить. (Я думаю, что это связано с визуальным деревом или datacontext контекстаMenu в wpf)ContextMenu Командная привязка не обновляется

У меня есть ParentViewModel с Combobox и ContentPresenter. Список отображения списка элементов ChildViewModel. Когда один выбран, он отображается с помощью contentpresenter.

В ChildViewModel есть команда для добавления элементов в список. Команда работает, если она привязана к кнопке, но когда это делается с помощью contextMenu, команда привязывается при первом выполнении, но не изменяется, если ChildViewModel изменен (когда в поле со списком выбрана другая модель представления). Элемент добавляется к предыдущему выбранному ChildViewModel.

Как я могу решить эту проблему?

Родитель ViewModel:

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> 

Ребенок ViewModel:

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> 

Заранее спасибо

ответ

1

Вы правы.

Контекстное меню не находится в визуальном дереве и только привязывает его datacontext один раз при загрузке программы.

Чтобы исправить это, я реализую Josh Smith's Virtual Branch technique.

Посмотрите на this answer I posted to a similar question

Смежные вопросы