如何与Model中的ViewModel进行通信

时间:2010-12-06 13:02:34

标签: wpf mvvm

我不再使用MVVM了。如果我在实施MVVM时遇到任何错误,请纠正我。

在我的Model类中有两个属性Price和IsChecked。

    public int Price { get; set; }
    public static int _total;

    bool _isChecked;
    public bool IsChecked
    {

        get
        {
            return _isChecked;

        }
        set
        {
            _isChecked = value;

            if (value == true)
            {
                _total+= this.Price;
            }
            else
            {
                _total-= this.Price;
            }


        }
    }

在我的ViewModel类中,有一个Type List< Model>属性。它在视图中与datagrid有界,另一个属性是Total,它与View中的textBlock绑定。

    public int Total
    {
        get
        {
            return  DocumentStoreModel._total;

        }
        set
        {

        }

    }

DataGrid有一个checkBox列,它与Ischecked属性绑定

<DG:DataGridCheckBoxColumn Header="Select" Binding="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></DG:DataGridCheckBoxColumn>

现在,如果用户从DataGrid中的复选框列中选中了复选框,则总计应反映在View中。

我的ViewModel类正在实现INotifyPropertyChanged接口。

我的问题是,如果我的模型的属性正在改变我如何告诉我的viewModel?

请让我知道如何实现这一目标。

3 个答案:

答案 0 :(得分:2)

据我所知,您的ViewModel的Total媒体资源指向您的模型Total媒体资源,因此您对模型总数所做的任何更改都将基本上也可以为ViewModel进行更改。

当您更改PropertyChanged时,您可能需要做的是在ViewModel上为Total属性引发IsChecked事件。这将告诉您的View更新整个文本块的数据。

答案 1 :(得分:0)

您需要实施Command(通过实施ICommand或其变体)并在ViewModel上公开为属性,并绑定在复选框上的事件视图上。

答案 2 :(得分:0)

当您在ViewModel中公开模型时,您需要在模型中实施INotifyPropertyChanged。但是你有一个问题,你的Total属性是静态的,并且(afaik)你不能使用INotifyPropertyChanged来获取静态属性。 我建议您在模型上创建一个可以在ViewModel上订阅的自定义事件。这是一个例子(你可能想稍微整理一下)。

public class Model : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    internal static event EventHandler TotalChanged;
    internal static int Total { get; private set;}

    private int price;
    public int Price
    {
        get { return price; }
        set
        {
            price = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Price"));
        }
    }

    private bool isChecked;
    public bool IsChecked
    {
        get { return isChecked; }
        set
        {  isChecked = value; 
            if (value)
                Total += Price;
            else
                Total -= Price;
            if (TotalChanged != null)
                TotalChanged(this, EventArgs.Empty);
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
        }
    }
}

public class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public int Total
    {
        get { return Model.Total;  }
    }

    public MainViewModel()
    {
        Model.TotalChanged += TotalChanged;
    }

    private void TotalChanged(object sender, EventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("Total"));
    }
}