WPF开发积累

1. Binding操作中涉及的Source与Target的概念

记住这个原则:搞清楚数据是如何流动的
Source: ViewModel数据源
Target:UI Views视图

<TextBox x:Name="TextBox" Text="{Binding SearchContent, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"

比如,上面针对Textbox的Text属性绑定操作,Mode参数常用的值有OneWay, OneWayToSource, TwoWay
先给出这几种方式,数据的流向:
OneWay:ViewModel数据源 --> UI Views视图
OneWayToSource: UI Views视图 --> ViewModel数据源
TwoWay: ViewModel数据源 <–> UI Views视图

OneWay:
对于OneWay的情况,如果ViewModel的数据源类型继承了INotifyPropertyChanged属性,比如:ObservableCollection

public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
{...}

那么,数据源变化,UI也会跟随变化,这个由WPF中的事件机制自动实现了。但是如果你是用的不具备INotifyPropertyChanged属性的数据源类型,比如List,DIctionary,String等,则需要手动通知UI更新,具体方法见 [第3条]

OneWayToSource
这个例子中因为绑定的是搜索框的内容,因此数据只会从UI流向VIewModel,因此选择OneWayToSource
这样设置之后,当用户在UI键入搜索内容时,ViewModel中的SearchContent属性值就会变为用户输入值。

TwoWay:
则是上面两种方式的结合。

2. ComoBox的最优实践

ComoBox可以利用字典方式完美解决ComoBox的双向转换。

SelectedValuePath:ComoBox选择后对应的编码值,源自字典的键
DisplayMemberPath:ComoBox显示UI的字符串值,源自字典的值
ItemsSource: ViewModel层定义的字典
SelectedValue:当前UI ComoBox选中的编码值。

// ViewModel 定义
public Dictionary<long, String> Regions { get; set; }
public long RegionId;

// 填充内容
Regions = new Dictionary<long, string>();
Regions.Add(1, "华北");
Regions.Add(2, "华南");
Regions.Add(3, "华中");
<!--绑定-->
<ComboBox Style="{DynamicResource ComboBoxStyle}" SelectedValuePath="Key" DisplayMemberPath="Value" ItemsSource="{Binding Regions}" SelectedValue="{Binding RegionId}" />

3. 在ViewModel实例化时已经初始化的Binding属性,其属性值在应用程序中改变,需要再次更新UI时,应该执行Notify方法手动通知UI。

使用方法:所有ViewModel都要继承BaseViewModel基类,在需要手动通知UI更新绑定属性时,调用Notify方法

public class BaseViewModel : INotifyPropertyChanged
{
    //INotifyPropertyChanged中定义的事件
    public event PropertyChangedEventHandler PropertyChanged;

    //触发PropertyChanged事件,通知界面更新
    // propName:要更新的绑定属性名称
    protected void Notify(string propName)
    {
        if (this.PropertyChanged != null)
        {
            //通知目标对象数据源属性已发生改变
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }

}

4. GUI线程与消息队列

基于消息的GUI构架

5. "依赖属性"实现Binding自动向UI元素树的上层寻找数据源

"依赖属性"就是一种可以自己没有值,并能通过使用Binding从数据源获得值(依赖在别人身上)的属性。拥有依赖属性的对象被称作“依赖对象”。
依赖属性的特性

6. 从已有集合中过滤检索

public ObservableCollection<PlatformDeviceViewModel> AvailableDeviceCollection { get; set; }
public ObservableCollection<PlatformDeviceViewModel> TotalDeviceCollection { get; set; }
        
private void Search_Execute(object parameter)
{
    AvailableDeviceCollection = new ObservableCollection<PlatformDeviceViewModel>(
        TotalDeviceCollection.Where(o => o.GatewayId.Contains((string)parameter)));
    Notify("AvailableDeviceCollection");
}

7. DataGrid选中一行触发处理事件

DataGrid上有个DataGridRow。
DataGridRow上可以写 MouseDown MouseUp这类事件可以实现重复选中行,当然,它也有Selected。
代码:

<DataGrid x:Name="DataGrid" Margin="10" AutoGenerateColumns="False" SelectionMode="Single" DataGridRow.MouseUp="OrderinfodataGrid_Click" >

只要在相应的.xaml.cs文件里写事件的实现就OK了
注意:使用MouseUp与MouseDown的前提是该项已经被选中,因此MouseUp点击的时候会选中该项,释放鼠标的时候触发事件;而MouseDown点击的时候是选中,需要再点击一次,才会触发事件。这是这两个的区别,因此这里使用MouseUp.

发布了11 篇原创文章 · 获赞 0 · 访问量 8788

猜你喜欢

转载自blog.csdn.net/wangyahua1234/article/details/100944373
今日推荐