wpf - 在 WPF MVVM 模式中更改查看按钮单击
问题描述
我在 Window 的一个用户控件(usercontrol1.xaml)上有 3 个按钮。现在单击按钮 1,我想将视图切换到另一个用户控件(usercontrol2.xaml),它又有 3 个按钮,依此类推。
如何在 WPF 中实现 MVVM 模式?
解决方案
请注意,我在此示例中使用 caliburn micro
private IEventAggregator _eventAggregator => IoC.Get<IEventAggregator>(key: nameof(EventAggregator));
private IWindowManager _windowManager => IoC.Get<IWindowManager>(key: nameof(WindowManager));
public ShellViewModel(IEventAggregator eventAggregator)
{
_eventAggregator.Subscribe(this);
}
public string _firstName;
// public ShellViewModel page = new ShellViewModel();
public string FirstName
{
get {
return _firstName;
}
set
{
_firstName = value;
NotifyOfPropertyChange(() => FirstName);
}
}
public ICommand ConvertTextCommand
{
get { return new DelegateCommand(ConvertText); }
}
void ConvertText()
{
//string url = "https://www.google.com/";
string url = FirstName;
string result;
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = client.GetAsync(url).Result)
{
using (HttpContent content = response.Content)
{
result = content.ReadAsStringAsync().Result;
}
}
}
//(MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";
//Application.Current.Resources.Add("PageSource", result);
// NavigationService.NavigateToViewModel<SecondViewModel>("Hello");
_windowManager.ShowWindow(new PageSourceViewModel(_eventAggregator), null);
_eventAggregator.PublishOnUIThread(result);
}
您可以检查 caliburn micro 并查看您可以在窗口管理器实例中创建一个新的视图模型
这里还有 2 个指向 2 个教程的链接,它们帮助我为 MVVM 解决了这个问题
https://www.youtube.com/watch?v=laPFq3Fhs8k
https://www.youtube.com/watch?v=9kGcE9thwNw&list=LLy8ROdSzpPJnikdZQ1XPZkQ&index=30&t=0s
第一个教程将帮助您大致了解。第二个将帮助您处理事件,您可以回顾我的代码,看看我是如何处理新窗口实例的。
您还可以像问题中所说的那样为同一窗口的新实例调用相同的视图模型
您还需要创建一个 boostrapper 类。对于我的例子,我是这样做的。
public class Bootstrapper : BootstrapperBase
{
private readonly SimpleContainer _container =
new SimpleContainer();
public Bootstrapper()
{
Initialize();
}
protected override void Configure()
{
_container.Instance<IWindowManager>(new WindowManager());
_container.Singleton<IEventAggregator, EventAggregator>();
_container.PerRequest<ShellViewModel>();
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
_container.Instance<SimpleContainer>(_container);
_container.Singleton<IWindowManager, WindowManager>(key: nameof(WindowManager))
.Singleton<IEventAggregator, EventAggregator>(key: nameof(EventAggregator));
DisplayRootViewFor<ShellViewModel>();
}
protected override object GetInstance(Type service, string key)
{
return _container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}
}
推荐阅读
- python - 如何在python中绘制和显示数据集的分布?
- laravel - 在加入类别表的请求中,我得到了请求表的无效 ID
- html - 真的对css链接感到困惑。据我所知,所有内容都输入正确,但无法正常工作
- ios - 无法在颤振上压缩文件
- c# - 如何根据用户输入查询 SQL 以获取最新记录?
- firebase - 在颤动中覆盖默认的 FCM 通知
- angular - Apollo 服务器使用部分数据引发多个错误
- python - 将 None 转换为空字符串并展平列表
- python - 添加新的列标题而不覆盖原始列标题
- firebase - 如何根据当前登录的用户检索 Firestore 文档数据