Привязка команды ContextMenu не обновлена - PullRequest
0 голосов
/ 29 марта 2012

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

У меня есть ParentViewModel с Combobox и ContentPresenter. В выпадающем списке отображается список 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>

Child 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 Ответ

1 голос
/ 29 марта 2012

Вы правы.

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

Чтобы исправить это, я реализую виртуальную ветвь Джоша Смита .

Посмотрите на этот ответ я отправил на похожий вопрос

...