XAML 中的 Source 与 DataContext

Jer*_*xon 4 data-binding wpf

这些方法中哪个最好?

<Window.Resources>
    <sys:Int16 x:Key="MyValue">123</sys:Int16>
</Window.Resources>

<StackPanel>

    <!-- method 1 -->
    <TextBlock Text="{Binding}" DataContext="{StaticResource MyValue}" />

    <!-- method 2 -->
    <TextBlock Text="{Binding, Source={StaticResource MyValue}}" />

</StackPanel>
Run Code Online (Sandbox Code Playgroud)

Sco*_*ott 5

与许多“哪个更好”的问题一样。我会说“这取决于”上下文。

它们都存在,因为它们都可以在不同的上下文中发挥作用。仅考虑您上面显示的内容,我会选择示例 2。

但是,当您设置 DataContext 时,它的所有子项都将继承该 DataContext。所以也许你正在使用一个按钮。在你的 Button 中,你想要让它更活泼一点,并用不同的颜色显示文本四次。如下所示,我将选择示例 1。

示例 1:(注意 DataContext 位于按钮上,TextBlocks 不需要像示例 2 中那样的 Source)

<Button DataContext="{StaticResource MyValue}" Height="Auto" Width="Auto" HorizontalAlignment="Center" VerticalAlignment="Center">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding}" Foreground="Red" />
        <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding}" Foreground="Blue" />
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding}" Foreground="Yellow"/>
        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding}" Foreground="Green" />
    </Grid>
</Button>
Run Code Online (Sandbox Code Playgroud)

示例 2:

<Button Height="Auto" Width="Auto" HorizontalAlignment="Center" VerticalAlignment="Center">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Red" />
        <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Blue" />
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Yellow"/>
        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Green" />
    </Grid>
</Button>
Run Code Online (Sandbox Code Playgroud)

当您绑定到一个只有一种表示形式的简单对象时,例如 Int16,您可能只绑定并显示一次该值,因此选项 2 最有意义。

一个很好的经验法则...如果您发现自己将“源”设置为多个绑定的相同内容,您可能应该只绑定公共父 FrameworkElement 的 DataContext。