像许多“哪个更好”的问题一样,我会说“这取决于”上下文。
它们都存在是因为它们在不同的情境下都可以发挥作用。根据你上面展示的内容,我会选择示例2。
然而,当你设置DataContext时,它的所有子项都将继承该DataContext。所以也许你正在使用一个Button。在你的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>
示例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>
当您绑定到一个简单对象,如您的情况下的Int16时,您可能只会绑定和显示该值一次,因此选项2最为合适。
一个好的经验法则...如果您发现自己将“源”设置为多个绑定的相同内容,则应该只将通用父FrameworkElement的DataContext进行绑定。