[英]Binding WPF Grid to a model
我有一个MVVM应用程序,该应用程序具有一个WPF网格,其中包含其他嵌入式WPF网格,同时,每个网格都包含一些字段(WPF TextBlocks)。
非常简化的示例-视图:
<Grid>
<Grid>
// Row definitions
// Colum definitions
<TextBlock Grid.Row="3" Grid.Column="0"
Text="{Binding Path=SomeField1}" />
<Grid>
<Grid>
// Row definitions
// Colum definitions
<TextBlock Grid.Row="0" Grid.Column="1"
Text="{Binding Path=SomeField2}" />
<Grid>
</Grid>
这些TextBlocks均绑定到视图模型中定义的字符串属性。
视图模型(它实现INotifyPropertyChanged) :
private string _someField1;
public string SomeField1
{
get return _someField1;
set
{
if (_someField1 == value) return;
_someField1 = value;
OnPropertyChanged("SomeField1");
}
}
private string _someField2;
public string SomeField2
{
get return _someField2;
set
{
if (_someField2 == value) return;
_someField2 = value;
OnPropertyChanged("SomeField2");
}
}
然后,我得到一个模型,我的意思是,一个具有一些公共属性的类,一旦从设备获取数据,该类就会由一个进程填充。 此类包含与视图模型中定义的属性完全相同的属性。
型号 :
public class MyModel
{
private string _someField1;
public string SomeField1
{
get return _someField1;
set
{
if (_someField1 == value) return;
_someField1 = value;
}
}
private string _someField2;
public string SomeField2
{
get return _someField2;
set
{
if (_someField2 == value) return;
_someField2 = value;
}
}
}
稍后从视图模型中,我从此类(模型)中提取数据,并将这些属性的值分配给视图模型中的匹配属性。 最后,由于view绑定到这些属性,因此使用以下示例正确地更新了view的值。
视图模型方法提取接收到的数据 :
private void DataReceived(MyModel data)
{
this.SomeField1= data.SomeField1;
this.SomeField2= data.SomeField2;
}
问题是我必须在视图模型和模型中定义两次属性。 因此,我想避免这种情况,我想将Textblocks直接绑定到模型中的属性,而不是在视图模型中定义属性以避免冗余代码。 或者例如,是否有任何简单的方法将模型(MyModel)绑定到外部主网格,然后将文本框绑定到视图模型中的属性(在datagrid中绑定itemsource时类似)?
我建议一个通用的视图模型:
public class BaseViewModel<TModel>
{
public TModel Model
{
get;
private set;
}
public BaseViewModel(TModel model)
{
this.Model = model;
}
}
然后可以绑定到它:
<TextBlock Grid.Row="3" Grid.Column="0" Text="{Binding Path=Model.SomeField1}" />
我在想下面是否可以并且尊重MVVM模式。 看到c0d3b34n提出的解决方案后,我已经想到了。 我认为它更简单,不需要做接口和通用视图模型。 我已经检查了并且可以正常工作:
在视图模型中声明属性:
private MyModel _model;
public MyModel Model
{
get { return _model; }
set
{
_model = value;
OnPropertyChanged("Model");
}
}
然后在视图中:
<TextBlock Grid.Row="3" Grid.Column="0" Text="{Binding Path=Model.SomeField1}" />
...,其余的TextBlocks也一样。
最后:
private void DataReceived(MyModel data)
{
this.Model = data;
}
但是正如BionicCode在评论中所说,该解决方案打破了MVVM模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.