私はすでにこの問題を抱えていますが、解決方法を思い出せません。(wpf の a contextMenu のビジュアル ツリーまたは datacontext に関連していると思います)
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>
前もって感謝します