【发布时间】:2021-06-28 01:31:47
【问题描述】:
我需要通过单击按钮从一个用户控件导航到另一个用户控件,并且我使用了两种不同的方法。
方法 1:我有一个带有一些按钮的主窗口,这些按钮将使用导航控制器选择我的“父”用户控件视图模型。
public NavigationController(MainWindowViewModel viewModel)
{
this.viewModel = viewModel;
}
public void Execute(object parameter)
{
string par = parameter.ToString();
switch (par)
{
case "0":
viewModel.SelectedViewModel = new ViewModel1();
break;
case "1":
viewModel.SelectedViewModel = new ViewModel2();
break;
}
}
XAML 端 (...)
<Button Command="{Binding NavigationController}" CommandParameter="1" />
<ContentControl Content="{Binding SelectedViewModel}" />
到目前为止一切都很好,我相信这是一个很好的策略。 但是对于方法 2,我选择了正确的“父”用户控件,按钮单击以不同的方式绑定: XAML
<Button cal:Message.Attach="ShowUserControl3()"/>
虚拟机
public object SelectedActionViewModel
{
get => _selectedActionViewModel;
set
{
_selectedActionViewModel = value;
}
}
public void ShowUserControl3()
{
_selectedActionViewModel = new VMusercontrol3();
OnPropertyChanged(nameof(SelectedActionViewModel));
}
这第二种方法效果很好.. 在我第一次或第二次单击按钮时。之后,OnPropertyChanged 继续传递 null 并且不会再选择正确的用户控件。我在这里错过了什么?
额外问题:如何从 UserControl4 中选择 UserControl3 ?
编辑:所有用户控件都继承自 BaseViewModel,这就是奇怪的地方,因为 propertyChanged 为 null
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public event EventHandler ClosingRequest;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
【问题讨论】:
-
“继续传递
null”,就像PropertyChanged事件中的null一样?取消选择视图时如何单击按钮? -
@mm8 抱歉忘记提及用户控件继承自 BaseViewModel 是 INotifyPropertyChanged (这就是它传递 null 的地方)。我编辑了帖子
标签: c# wpf caliburn.micro