数据绑定可以将任何控件的任何属性绑定到其他控件的属性、对象、数据库等,在WPF中,数据绑定主要在如下所示的两个对象之间建立关系。

  • 数据源对象:WPF将从改对象中提取信息,交由目标对象进行显示。
  • 目标对象:从数据源中提取信息,并赋给该对象的属性。

C#WPF 在Binding 中Path的意思

<TextBox x:Name="txt1" />
<TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />

//绑定的是名为txt1的 TextBox(控件类型)控件,但是TextBlock要显示的当然不是控件类型了,所以需要一个标示再次指定显示什么,Path就有用了,在这里表示TextBox类型控件的Text值,就是说,txt1中显示的值。
“{Binding Path=Text, ElementName=txt1}” 标示 txt1中的Text的值。

<TextBlock x:Name="txt2" Text="{Binding Path=Text, ElementName=txt1}" />

如果 txt1.Text 是“这是txt1”,txt2由于它的Text绑定了txt1.Text属性,所以txt2.Text 显示的也是“这是txt1”,而且如果txt1.Text的值变动,txt2.Text的值也变动。


绑定多个属性
XAML:其中还涉及绑定方向,绑定更新的内容,后面一一介绍

Grid  Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <!-- 数据源对象-->
        <Slider Name="sliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10"></Slider>
        <TextBox Name="txtContent" Margin="3" Grid.Row="1" Text="示例内容"></TextBox>
        <ListBox Margin="3" Grid.Row="2" Name="lstColors">
            <ListBoxItem Tag="Blue">蓝色</ListBoxItem>
            <ListBoxItem Tag="DarkBlue">深蓝</ListBoxItem>
            <ListBoxItem Tag="LightBlue">淡蓝</ListBoxItem>
        </ListBox>
        <!--实现多个数据源绑定,目标对象-->
        <TextBlock Margin="3" Name="lblSampleText"
                   FontSize="{Binding ElementName=sliderFontSize,Path=Value}" Grid.Row="3"
                   Text="{Binding ElementName=txtContent,Path=Text, Mode=OneWay}"
                   Foreground="{Binding ElementName=lstColors,Path=SelectedItem.Tag}"
                   >
            
        </TextBlock>
        <TextBox
            Margin="3" Name="lblSampleText2"
             FontSize="{Binding ElementName=sliderFontSize,Path=Value}" Grid.Row="4"
                   Text="{Binding ElementName=txtContent,Path=Text, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged
            }"
                   Foreground="{Binding ElementName=lstColors,Path=SelectedItem.Tag}"
            >

        </TextBox>
    </Grid>

绑定的方向,使用Mode属性指定。

  • OneWay:当源属性发生更改时更新目标属性
  • TwoWay:当源属性发生更改时更新目标属性,当目标属性发生更改时,同时也更新源属性
  • OneTime:仅当程序启动时或DataContext进行更改时更新目标属性
  • OneWayToScource:目标属性更改时更新源属性
  • Default:使用目标属性默认Mode值

绑定更新
在TwoWay模式,当目标对象发生更改时,变化不会立即被传递到数据源。这时需要定义Binding.UpdateSourceTrigger属性。

  • Default:绑定目标属性默认UpdateSourceTrigger值。多数依赖项属性的默认值为PeopertyChanged,而Text属性的默认值为LostFocus。
  • PeopertyChanged:当绑定目标属性更改时,立即更新绑定源。
  • LostFocus:当绑定目标元素失去焦点时,更新绑定源。
  • Explicit:仅在调用UpdateSource()方法时更新绑定源。
    就像上述例子一样,用到的是PeopertyChanged。
    UpdateSourceTrigger.Explicit则在用户显示地调用代码才能更新,这在一些场合是非常有用的,比如,如果希望用户一次性输入所有设定后,单击一个确定按钮,才将用户所作的改变提交并更新这种情形下。一般是调用BindingExpression.UpdateSource方法触发立即更新。
    BindingExpression封装了与绑定有关的信息。
    例子:
    XAML
<Grid  Margin="5">
   <!-- 绑定来源-->
        <ScrollBar Name="scroll" Orientation="Horizontal" Margin="24" Maximum="100" LargeChange="10" SmallChange="1"/>
        <!-- 绑定目标-->
        <TextBox HorizontalAlignment="Center" Name="scrollfontsize" Width="200"  Height="50" Text="{Binding ElementName=scroll, Path=Value,Mode=TwoWay, UpdateSourceTrigger=Explicit}" FontSize="30" Margin="10,0,297,0" VerticalAlignment="Top"/>
        <!--应用更新按钮-->
        <Button Name="btn" Content="应用更新" Width="50" Click="btn_Click" Height="30" Margin="352,33,105,247"/>
    </Grid>

后台

private void btn_Click(object sender, RoutedEventArgs e)
        {
            //获取应用到TextBox的BindingExpression对象
            BindingExpression binding = scrollfontsize.GetBindingExpression(TextBox.TextProperty);
            //更新ScrollBar的value属性
            binding.UpdateSource();
        }

引申:[WPF]静态资源(StaticResource)和动态资源(DynamicResource)