在我的上一篇文章:[WPF]WPF中如何实现数据与表示分离。(一) —— XAML 中,我简单介绍了如何使用XAML描述应用程序的界面。比较遗憾的是,那篇文章其实和数据与表示分离的主题似乎不大。这一篇文章中,我们将重点讨论WPF的Binding功能。

还是用ColorPicker来作为例子。现在我们需要将它的数据层和表示层进行划分。在这个例子中,数据层的业务逻辑很简单:能够根据给入的三个变量生成一个颜色值。如果将它描述为一个对象,可能是下面的结构。
 1[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    public class ColorPickerData
 2
(注意:以上代码仅为说明问题。对于实现方式,大家应该都有更好的想法。)
然后表示层通过一定的途径将这些信息展示出来。

于是,我们编写了如下的展示层XAML文件,试图让它能够很好的展示这个数据对象。
 1[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)<Window x:Class="ColorPicker2.Window1"
 2[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
 3[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
 4[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    Title="ColorPicker2"
 5[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    Height="130" Width="300"
 6[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    >
 7[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    <Grid>
 8[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Grid.RowDefinitions>
 9[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <RowDefinition/>
10[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <RowDefinition/>
11[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <RowDefinition/>
12[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Grid.RowDefinitions>
13[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Grid.ColumnDefinitions>
14[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <ColumnDefinition Width="40"/>
15[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <ColumnDefinition Width="150"/>
16[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <ColumnDefinition/>
17[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Grid.ColumnDefinitions>
18[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
19[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <TextBlock Grid.Column="0" Grid.Row="0">Red:</TextBlock>
20[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Slider Grid.Column="1" Grid.Row="0"
21[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)                Minimum="0" Maximum="255"/>
22[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
23[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <TextBlock Grid.Column="0" Grid.Row="1">Green:</TextBlock>
24[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Slider Grid.Column="1" Grid.Row="1"
25[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)                Minimum="0" Maximum="255"/>
26[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
27[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <TextBlock Grid.Column="0" Grid.Row="2">Blue:</TextBlock>
28[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Slider Grid.Column="1" Grid.Row="2"
29[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)                Minimum="0" Maximum="255"/>
30[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
31[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Border Grid.Column="2" Grid.Row="0" Grid.RowSpan="3" Margin="5,5,5,5">
32[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <Border BorderThickness="1" CornerRadius="5" BorderBrush="Gray"/>
33[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Border>
34[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    </Grid>
35[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)</Window>
现在,看起来结构更加清晰一些了。但是,我们如何让数据层和表示层进行衔接呢?往往这些衔接的逻辑可能会使我们系统的层次界限变得模糊。最终变成了铁板一块。

我们来看一下在WPF中是如何实现这种衔接的。下面的是完整的数据展示层XAML。
 1[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)<?Mapping XmlNamespace="local" ClrNamespace="ColorPicker2"?>
 2[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)<Window x:Class="ColorPicker2.Window1"
 3[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
 4[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
 5[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    xmlns:l="local" 
 6[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    Title="ColorPicker2"
 7[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    Height="130" Width="300"
 8[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    >
 9[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    <Grid>
10[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Grid.Resources>
11[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <l:ColorPickerData x:Key="colorPickerData"/>
12[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Grid.Resources>
13[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Grid.DataContext>
14[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <Binding Source="{StaticResource colorPickerData}"/>
15[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Grid.DataContext>
16[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Grid.RowDefinitions>
17[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <RowDefinition/>
18[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <RowDefinition/>
19[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <RowDefinition/>
20[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Grid.RowDefinitions>
21[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Grid.ColumnDefinitions>
22[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <ColumnDefinition Width="40"/>
23[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <ColumnDefinition Width="150"/>
24[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <ColumnDefinition/>
25[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Grid.ColumnDefinitions>
26[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
27[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <TextBlock Grid.Column="0" Grid.Row="0">Red:</TextBlock>
28[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Slider Grid.Column="1" Grid.Row="0"
29[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)                Minimum="0" Maximum="255" Value="{Binding Path=Red}"/>
30[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
31[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <TextBlock Grid.Column="0" Grid.Row="1">Green:</TextBlock>
32[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Slider Grid.Column="1" Grid.Row="1"
33[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)                Minimum="0" Maximum="255" Value="{Binding Path=Green}"/>
34[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
35[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <TextBlock Grid.Column="0" Grid.Row="2">Blue:</TextBlock>
36[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Slider Grid.Column="1" Grid.Row="2"
37[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)                Minimum="0" Maximum="255" Value="{Binding Path=Blue}"/>
38[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)
39[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        <Border Grid.Column="2" Grid.Row="0" Grid.RowSpan="3" Margin="5, 5, 5, 5">
40[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)            <Border BorderThickness="1" CornerRadius="5" BorderBrush="Gray" Background="{Binding Path=Background}"/>
41[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)        </Border>
42[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)    </Grid>
43[WPF]WPF中如何实现数据与表示分离。(二) —— Binding(上)</Window>
与前一个XAML不同的地方主要在于黄色标注的部分。

在行10-12中,我们将一个ColorPickerData数据包作为一个资源嵌入到这个XAML中来。并且将Grid的当前数据内容映射到这个数据包上(行13-15声明)。

然后将后面的三个Slider的Value属性分别绑在数据包的几个不同的属性上。将Border的Background也绑定到数据包的Background属性上。

Ok,看起来展示层已经描述的很清楚了。WPF项目组的一个PM(产品经理)看着这个设计露出了非常满足的笑容。清晰,明了,解决了大多数的用户需求。如果你是WPF项目组中的一个开发人员,现在你一定会跳得很高。

“不可能,我怎么知道数据层什么时候变化了?”
“不可能,你所描述的结构,我必须使用反射来读取数据,这样的性能将是无法接受的。”
“不可能…………”你想了想,说:“对不起,麻烦问一下,‘{Binding Path=Blue}’似乎没有见过,代表什么呢?” -_-!

Ok,这一切都是可能的。在下一篇文章里,我们将讨论微软是如何解决这些问题的。

相关文章:

  • 2022-12-23
  • 2021-10-31
  • 2021-05-24
  • 2021-09-27
  • 2022-12-23
  • 2022-01-11
  • 2022-12-23
猜你喜欢
  • 2021-09-12
  • 2022-01-07
  • 2022-02-07
  • 2021-06-03
  • 2021-11-01
相关资源
相似解决方案