WPF - 两个不同ViewModel上的绑定和命令

时间:2016-05-03 08:44:28

标签: c# wpf xaml mvvm binding

它是这样的..我在一个相同的XAML文件下有两个viewModels。

ViewModel(1) - 包含一个按钮,该按钮具有将在该视图模型中触发函数的命令。

ViewModel(2) - 包含绑定到XAML的属性

问题:我是否可以使用命令更新 ViewModel(2)中的特定属性 >在 ViewModel(1)?如果是,我可以就如何处理它做一个简短的指导吗?

该要求设置我不做任何更改,例如将属性转移到与命令相同的viewModel中。

提前感谢您的任何帮助:)

3 个答案:

答案 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; }
}