我不再使用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?
请让我知道如何实现这一目标。
答案 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"));
}
}