它是这样的..我在一个相同的XAML文件下有两个viewModels。
ViewModel(1) - 包含一个按钮,该按钮具有将在该视图模型中触发函数的命令。
ViewModel(2) - 包含绑定到XAML的属性
问题:我是否可以使用命令更新 ViewModel(2)中的特定属性 >在 ViewModel(1)?如果是,我可以就如何处理它做一个简短的指导吗?
该要求设置我不做任何更改,例如将属性转移到与命令相同的viewModel中。
提前感谢您的任何帮助:)
答案 0 :(得分:2)
我认为你应该使用Messenger 这是一篇关于mvvm架构中的Messenger的好文章 有点旧,但它可以帮助你imo:https://msdn.microsoft.com/en-us/magazine/jj694937.aspx
这是一个例子,适合你。例如,我使用Galasoft的MVVM Light,尽可能最直接:) http://www.galasoft.ch/mvvm/
首先,我建议您创建一个与您要广播的消息相关的实体:
我添加了一个简单的字符串属性,但显然你可以添加你想要的任何东西:)
public class Vm1toVm2Message
{
public String Message { get; set; }
}
然后在您的VM1中创建消息并进行广播:
public class ViewModel1 : ViewModelBase
{
private RelayCommand _refreshCommand;
public RelayCommand RefreshCommand
{
get
{
return _refreshCommand ?? (_refreshCommand = new RelayCommand(() =>
{
// You button command code
// -------------------
// Send a message
Messenger.Default.Send<Vm1toVm2Message>( new Vm1toVm2Message { Message = "Update from VM1" });
}));
}
}
}
最后在你的VM2中,你等待收到的消息:)
public class ViewModel2 : ViewModelBase
{
public ViewModel2()
{
Messenger.Default.Register<Vm1toVm2Message>(this, HandleVm1toVm2Message);
}
private void HandleVm1toVm2Message(Vm1toVm2Message msg)
{
// Do what you want here
}
}
答案 1 :(得分:1)
你可以试试这个:
public class FirstViewModel : INotifyPropertyChanged
{
public delegate void PropertyChangedHandler(object obj);
public static event PropertyChangedHandler MyPropertyChanged = delegate { };
public FirstViewModel()
{
//Example: here I fire the function in the second ViewModel with parameter
var obj = new { Name = "Jhon" };
MyPropertyChanged(obj);
}
}
第二个ViewModel
public class SecondViewModel : INotifyPropertyChanged
{
public SecondViewModel()
{
FirstViewModel.MyPropertyChanged += OnMyPropertyChanged;
}
public void OnMyPropertyChanged(object obj)
{
//...
}
//....
}
答案 2 :(得分:1)
在viewmodel 1中,您可以存储一个更新viewmodel 2中属性的操作。在viewmodel 1中,您可以调用该操作,并且viewmodel 2已更改。
public class SomeOtherClass
{
public void main()
{
var vm1 = new ViewModel1();
var vm2 = new ViewModel2();
vm1.ChangeValueAction = new Action(() => { vm2.SomeProperty = String.Empty; });
}
}
public class ViewModel1
{
public Action ChangeValueAction { get; set; }
public void SomeMethod()
{
ChangeValueAction.Invoke();
}
}
public class ViewModel2
{
public string SomeProperty { get; set; }
}