WPF入门教程系列十六——WPF中的数据绑定(二)

3、绑定模式

    经过上一文章中的示例,学习了简单的绑定方式。在这里的示例,要学习一下绑定的模式,和模式的使用效果。app

    首先,咱们来作一个简单示例,这个示例是根据ListBox中的选中项,去改变TextBlock的背景色。将 TextBlock 的背景色绑定到在 ListBox 中选择的颜色。在下面的代码中针对TextBlock的 Background 属性使用绑定语法绑定从 ListBox 中选择的值。代码以下。学习

  

 <StackPanel Grid.Row="1">

            <TextBlock Width="248" Height="24" Text="颜色:"

        TextWrapping="Wrap"/>

            <ListBox x:Name="listColor" Width="248" Height="56">

                <ListBoxItem Content="Blue"/>

                <ListBoxItem Content="Red"/>

                <ListBoxItem Content="Green"/>

                <ListBoxItem Content="Gray"/>

                <ListBoxItem Content="Cyan"/>

                <ListBoxItem Content="GreenYellow"/>

                <ListBoxItem Content="Orange"/>

            </ListBox>

            <TextBlock Width="248" Height="24" Text="改变背景色:" />

            <TextBlock Width="248" Height="24" Background="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}">

            </TextBlock>

        </StackPanel>

 

 

 

     若是用户在 ListBox 中选择了一种颜色,那么TextBlock 的背景色会变为选定的颜色(如下图1)。spa

 

图1code

    接下来咱们对上面的示例进行一些修改:orm

    1)  同一个数据源绑定到两个或多个控件上。如咱们的示例中把ListBox的选中项绑定到TextBox与TextBlock。对象

    2)  在绑定语法中增长一个 Mode 属性,即绑定模式。对于咱们的示例,咱们把TextBlock的绑定语法中的Mode属性设为 OneWay 。把TextBox的绑定语法中的Mode属性设为TwoWay。blog

 

    对于示例中的Mode进行一下简单说明(具体能够参见前一篇):ci

    1)使用 OneWay 绑定时,每当数据源(ListBox)发生变化时,数据就会从数据源流向目标(TextBlock)。it

    2)OneTime 绑定也会将数据从源发送到目标;可是,仅当启动了应用程序或 DataContext 发生更改时才会如此操做,所以,它不会侦听源中的更改通知。io

    3)OneWayToSource 绑定会将数据从目标发送到源。

    4)TwoWay 绑定会将源数据发送到目标,但若是目标属性的值发生变化,则会将它们发回给源。

 

    下面就是修改后的示例代码,功能是将 TextBlock (OneWay) 和 TextBox (TwoWay) 绑定到 ListBox 的代码:

 

 <StackPanel Grid.Row="1">

            <TextBlock Width="248" Height="24" Text="颜色:"

        TextWrapping="Wrap"/>

            <ListBox x:Name="listColor" Width="248" Height="56">

                <ListBoxItem Content="Blue"/>

                <ListBoxItem Content="Red"/>

                <ListBoxItem Content="Green"/>

                <ListBoxItem Content="Gray"/>

                <ListBoxItem Content="Cyan"/>

                <ListBoxItem Content="GreenYellow"/>

                <ListBoxItem Content="Orange"/>

            </ListBox>

            <TextBlock Width="248" Height="24" Text="改变背景色:" />

            <TextBlock Width="248" Height="24" Text="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}"

                       Background="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}">

 

            </TextBlock>

            <TextBox Name="txtTwoWay" Text="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}"

                     Background="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}"></TextBox>

        </StackPanel>

 

 

图 2

     在上述示例中,对TextBlock使用了 OneWay 绑定模式,由于我但愿只有当选择了 ListBox 中的某一项以后,应用程序将选定的 ListBoxItem(数据源)发送到 TextBlock。我不但愿 TextBlock 的变动会影响到 ListBox中的内容。

     我对TextBox使用 TwoWay 绑定模式,由于我但愿用户在 ListBox 中选择一种颜色后,该颜色就会显示在 TextBox 中,而且其背景色也会随之相应变化。若是该用户在 TextBox 中键入了一种颜色(例如Pink),ListBox 中刚才选中的颜色名称就会被更新(即从目标到数据源),当鼠标再次点击这条修改后的数据时,新值就会被再次发送到TextBox上。这意味着 TextBlock 也会随之改变。(请参见图 2)。

 

     若是我将 TwoWay 模式改回到 OneWay,用户则能够编辑 TextBox 中的颜色,可是不会将TextBox中输入的值去替换ListBox中选中项的值。

     绑定模式如何应用呢?下面是我的的一点看法:

    1)当只想让用户看到数据,而不但愿用户去修改数据时,能够采用 OneWay 模式,相似winform中的只读属性。

    2)当但愿用户能够对控件中的数据进行修改,同时让用户修改的数据更新到数据源(DataSet、对象、XML 或其余绑定控件)中时,可使用 TwoWay 绑定。

    3)若是想让用户修改数据源中的数据,而又不想使用TowWay模式,就可使用 OneWayToSource 绑定。OneWayToSource模式容许经过在原来被看做是绑定源的对象中放置绑定表达式,从而翻转源和目标。

    4)当你的界面中的一系列只读控件均被绑定了数据,而且当用户刷新了数据源时,但愿绑定控件中的值仍保持不变,可使用 OneTime 绑定。此外,当源没有实现 INotifyPropertyChanged 时,OneTime 绑定模式也是一个不错的选择。

 

说明:绑定目标中的修改什么时候去修改数据源

     在上面的例子中,TextBox 使用了 TwoWay 绑定模式,因此当TextBox 失去焦点时WPF会使用TextBox中的值改变ListBox中的值。若是你不想在TextBox失去焦点时,就去修改ListBox中的值,能够为 UpdateSourceTrigger 指定值,它是用于定义什么时候更新源的绑定属性。能够为 UpdateSourceTrigger 设置三个值:Explicit、LostFocus 和 PropertyChanged。

    若是将 UpdateSourceTrigger 设置为 Explicit,则不会更新源,除非从代码中调用 BindingExpression.UpdateSource 方法。设置为LostFocus ,(TextBox 控件的默认值)指示数据源绑定的控件失去焦点时才会更新。PropertyChanged 值绑定控件的绑定属性每次发生更改时就去更新数据源中的值。

相关文章
相关标签/搜索