在第2级的this WPF tutorial中,作者在Window.Resources
中创建了viewModel,如下所示:
<Window.Resource>
<local:myViewModel x:Key="viewmodel"/>
</Window.Resource>
并使用{Binding myValue, Source={StaticResource myViewModel}}
绑定每个值,但是其他类似的教程会将Window.DataContext
设置为viewModel,如下所示:
<Window.DataContext>
<local:myViewModel />
</Window.DataContext>
然后使用{Binding myValue}
简单地绑定值。
我的问题是:它们之间是否存在明显差异,或者这是用户偏好?
答案 0 :(得分:1)
存在语义差异。
DataContext
设置为模型类的实例,则每个元素都有自己的实例。为了说明,请考虑此模型类:
public class Model
{
private static int counter;
private readonly int id;
public Model()
{
id = counter++;
}
public override string ToString()
{
return id.ToString();
}
}
...以及一些使用它的XAML片段:
<Window.Resources>
<wpf:Model x:Key="ModelResource"/>
</Window.Resources>
...
<StackPanel HorizontalAlignment="Center" Margin="20" Orientation="Horizontal">
<Button Content="{StaticResource ModelResource}" />
<Button Content="{StaticResource ModelResource}" />
<Button Content="{Binding}">
<Button.DataContext>
<wpf:Model />
</Button.DataContext>
</Button>
<Button Content="{Binding}">
<Button.DataContext>
<wpf:Model />
</Button.DataContext>
</Button>
<Button Content="{StaticResource ModelResource}" />
</StackPanel>
输出: