创建一个viewmodel作为DataContext与StaticResource的价值是什么

时间:2016-11-28 01:31:07

标签: c# wpf xaml mvvm datacontext

在第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}简单地绑定值。

我的问题是:它们之间是否存在明显差异,或者这是用户偏好?

1 个答案:

答案 0 :(得分:1)

存在语义差异。

  • 如果多个控件引用静态资源,则它们都引用同一个对象。
  • 如果将UI元素的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>

输出:

enter image description here