如何从 Model 与 ViewModel 进行通信

3

我对MVVM还比较陌生,如果我在实现MVVM时出现了任何错误,请纠正我。

在我的模型类中,有两个属性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类中,有一个类型为List<Model>的属性,它绑定到视图中的数据网格(datagrid),另一个属性是Total,它绑定到视图中的文本块(textBlock)。

    public int Total
    {
        get
        {
            return  DocumentStoreModel._total;

        }
        set
        {

        }

    }

DataGrid有一个复选框列,并且它与IsChecked属性绑定。

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

现在,如果用户在DataGrid的复选框列中勾选了复选框,则总数应该反映在视图中。

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

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

请告诉我如何实现这一点。

3个回答

2
据我所知,您的 ViewModel 的 Total 属性指向您的 Model 的 Total 属性,因此您对 Model 的总数所做的任何更改本质上都将被应用于 ViewModel。
但是,当 IsChecked 改变时,您可能需要在 ViewModel 上引发 PropertyChanged 事件,以便为 Total 属性更新数据并通知视图更新您的总文本块。请注意保留 HTML 标签。

0
你需要实现一个 Command(通过实现 ICommand 或其变体),并将其公开为 ViewModel 上的 属性,然后在视图上将其 绑定 到复选框事件上。

0

由于您在ViewModel中公开了您的模型,因此您需要在模型中实现INotifyPropertyChanged。 但是,您有一个问题,即您的Total属性是静态的,(据我所知)您无法为静态属性使用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"));
    }
}

谢谢Dean,我使用了相同的方法。唯一的区别是我使用了委托而不是事件。我不确定这种方法是否符合MVVM的要求,所以我问了这个问题。谢谢。 - Nikhil Vaidya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接