WPF的界面的确好看,也引入了很多新功能,和winform相比更先进更强大......那么狗儿蛋,代价是什么?
代价就是WPF学起来比较费力。
数据绑定是WPF的特色之一,可以省去写代码更新UI界面的工作。这次打算做一个管理数据的小软件,自然的我也打算在界面上弄个TreeView,然后把它和数据源绑定,实现的效果是这样:
OK,起初一切都很顺利。我在设计器里布了一个TreeView,代码是下面这样:
<TreeView x:Name="TreePoints" AllowDrop="True" >
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:ScanCollection}" ItemsSource="{Binding Points}">
<materialDesign:ColorZone Mode="PrimaryLight" CornerRadius="6" Padding="2">
<TextBlock Text="{Binding Path=Name}" FontSize="14"/>
</materialDesign:ColorZone>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:ScanPoint}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" Margin="4 0"></TextBlock>
<TextBlock Text="{Binding Converter={StaticResource V3ToStringConverter}}" Margin=" 4 0"></TextBlock>
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
然后准备一个List装数据,在程序初始化时候把TreeView的ItemSource绑好。
public MainWindow()
{
InitializeComponent();
scans = new List<ScanCollection>();
TreePoints.DataContext = scans;
}
然后调试~~~~
啊咧,当给List添加或者删除成员时,这个界面完全没有反映嘛!
想了想,这是因为C#里,List其实是一个指针,List里面的内容随便怎么变化指针的值是压根不变的。于是WPF就会认为没必要更新界面。
于是解决方案之一就是把TreeView的数据源换成一个新的List,然后再换回来,就像这样:
TreePoints.DataContext = new List<ScanCollections>(){};
TreePoints.DataContext = scans;
这不是找事么...违背了数据绑定的初衷。有没有更好的办法?
搜了一圈,答案是使用ObservableCollection来代替List,那么就动手把数据源改成这样:
scans = new ObservableCollection<ScanCollection>();
TreePoints.DataContext = scans;
运行起来,还是不行。Emm...到底哪里不对
再翻一翻,发现TreeView的绑定中应当指定 UpdateSourceTrigger,因此需要设计器中这样修改:文章来源:https://www.toymoban.com/news/detail-488322.html
<TreeView x:Name="TreePoints" AllowDrop="True" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}">
再次编译调试,OK啦文章来源地址https://www.toymoban.com/news/detail-488322.html
到了这里,关于WPF绑定数据,增删改后实时更新TreeView/ListView的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!