双向绑定:个人理解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中释放天性。


然后项目中功能运用的代码片段如下

  1. 需要在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>

  2. 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; }  }
    
  3. 需要注意前端xaml绑定实体类的字段后,后端一定要实现 INotifyPropertyChanged 接口,否则绑定无效。 因为我在xaml绑定了ListView 的ItemSource 的源为MSICDSource,所在我在业务层中实现了一个双向绑定 代码片段如下:

     private List&lt;Micd10&gt; msicdSource;  
     public List&lt;Micd10&gt; 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 =&gt; p.MICD10.Contains(position.Text) || p.CDISE.Contains(position.Text) || p.PINYIN.Contains(position.Text) ).ToList();  
         }  
         else   
         {  
             MSICDSource = _micd10.Where(p =&gt; 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接口

  1. xaml 页面添加 DataContext=”{Binding RelativeSource={RelativeSource Mode=Self}}” 关键代码