双向绑定:个人理解winform和wpf都可以做,但是winform没办法做到像WPF中那样,业务逻辑与UI完全解藕。
emmmm~~
wpf就要提到mvvm
Winform的数据绑定也就局限于DataGrid, combobox, listview 等这类数据源的绑定,并不是真正意义的MVVM,像一些控件的属性比如TextBox的Text属性,Checkbox的checked等等,并不能做到绑定ViewModel的某个属性上。
WPF的UI是以Xaml语言描述,支持数据绑定的语法,可以真正做到UI与业务逻辑完全分离。View只是显示数据与发送命令,而ViewModel则是提供数据与执行命令。各司其职,互不影响。后期护展与维护也是很灵活。
其实wpf中的数据绑定,主要是围绕者xaml 其实和html没什么区别 的属性值进行绑定的。
嗯,示例应该是这样
<TextBox Text="abc" Width="140" Height="40" Margin="3">
其中每一个具体属性值都可以写成{binding xxx}
<TextBox Text="{binding xxx}" Width="{binding xxx}" Height="{binding xxx}" Margin="{binding xxx}">
它的本质就是一个class 的 objet
Class
{
string text;
int width;
int height
int margin;
}
既然TextBox的本质是一个class,那不就是其它class修改TextBox的class 的属性这么简单的事了么
winform可能能够做到一定程度的双向绑定,但是wpf的数据绑定,都是绑定到xaml 的标签属性上的
WPF的核心还是XAML,而MVVM刚好天生适合在XML中释放天性。
然后项目中功能运用的代码片段如下
-
需要在xaml下绑定类的字段名,代码片段如下
<ListView Grid.Row=”1” x:Name=”itemList”
MouseDoubleClick=”ListView_MouseDoubleClick”
ItemsSource=”{Binding MSICDSource}”
ItemContainerStyle=”{StaticResource ListViewItemStyle}”><ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding=”{Binding Path=MICD10}”
Header=”MICD10” Width=”100”/>
<GridViewColumn DisplayMemberBinding=”{Binding Path=SICD10”
Header=”SICD10” Width=”100”/>
<GridViewColumn DisplayMemberBinding=”{Binding Path=CDISE}”
Header=”诊断关键字” Width=”120”/>
</GridView>
</ListView.View>
</ListView>
-
MICD10,SICD10,CDISE 分别为实体类的字段名称,实体类对应代码片段如下:
public class Micd10: INotifyPropertyChanged { [ModelDisplayName(“MICD”)] public string MICD10 { get; set; }
[ModelDisplayName("SICD10")] public System.String SICD10{ get; set; } [ModelDisplayName("CDISE")] public System.String CDISE{ get; set; } } -
需要注意前端xaml绑定实体类的字段后,后端一定要实现 INotifyPropertyChanged 接口,否则绑定无效。 因为我在xaml绑定了ListView 的ItemSource 的源为MSICDSource,所在我在业务层中实现了一个双向绑定 代码片段如下:
private List<Micd10> msicdSource; public List<Micd10> MSICDSource { get { return msicdSource; } set { if (msicdSource == value) return; msicdSource = value; OnPropertyChanged(nameof(MSICDSource)); } } private void btnQuery_Click() { if (string.IsNullOrEmpty(position.Text)) { ShowNotify("请输入查询参数"); return; } if (!_micd10.Any()) { ShowNotify("未找到查询数据"); return; } if (ismicd) { MSICDSource = _micd10.Where(p => p.MICD10.Contains(position.Text) || p.CDISE.Contains(position.Text) || p.PINYIN.Contains(position.Text) ).ToList(); } else { MSICDSource = _micd10.Where(p => p.SICD10.Contains(position.Text) || p.CDISE.Contains(position.Text) || p.PINYIN.Contains(position.Text)).ToList(); } labTotal.Content = MSICDSource.Count(); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
ps:双向绑定的关键
1.xaml 绑定实体类名称
2.INotifyPropertyChanged接口
- xaml 页面添加 DataContext=”{Binding RelativeSource={RelativeSource Mode=Self}}” 关键代码
