使用ViewModel作为WPF DataContext处理问题

时间:2011-09-28 11:19:58

标签: wpf mvvm datacontext

刚开始使用WPF / MVVM并且有一个关于使用viewmodel作为wpf窗口的datacontext的问题。

我正在使用视图第一种方法,我的视图看起来像这样;

<Window x:Class="TestContext.TestForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TestForm" Height="300" Width="300"
    DataContext="{StaticResource testViewModel}">
    <Grid>
        <TextBox Text="{Binding Path=Address}" Height="23" HorizontalAlignment="Left" Margin="34,44,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
   </Grid>
</Window>

我在这样的代码中创建了我的viewmodel;

public class ViewModelFactory
{
    public TestViewModel CreateTestViewModel()
    {
        return new TestViewModel();
    }
}

我在app.xaml中使用以下方法在我实例化视图时创建viewmodel的实例;

<ObjectDataProvider x:Key="testViewModel" ObjectInstance="{StaticResource viewModelFactory}" MethodName="CreateTestViewModel">

一切正常。

问题是我只看到一次创建的viewmodel。因此视图的新实例使用视图模型的相同实例。

我想开始使用viewmodel的新实例。

如果我在表单构造函数中手动创建视图模型;

public TestForm()
{
    InitializeComponent();
    this.DataContext = new TestViewModel();
}

然后按预期工作。

我正试图了解这里发生的事情......

...谢谢

4 个答案:

答案 0 :(得分:1)

老实说,ObjectDataProvider使用App并不是一个好主意,因为每个testViewModel该实例都是单个的。

但如果你坚持重新创建视图模型,则必须刷新testViewModel.Refresh();

您这样做的方式是{{1}}

答案 1 :(得分:0)

是,同意@AngelWPF你应该使用set DataContext作为  View.DataContext = ViewModel;

答案 2 :(得分:0)

您可以在视图的资源部分中实例化视图模型。创建新视图后,您将获得新的视图模型。

此外,您将获得静态绑定,这些绑定有点高效且使用方便,因为您将获得智能化。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication1="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <WpfApplication1:MyViewModel x:Key="ViewModel"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource ViewModel}">
        <ItemsControl ItemsSource="{Binding Data}"/>
    </Grid>
</Window>

答案 3 :(得分:0)

在代码中

  1. 创建视图
  2. 在视图上创建单个属性(称为VM)
  3. 创建您的viewmodel
  4. 将新的视图模型分配给VM
  5. 将DataContext设置为ViewModel
  6. 在XAML中设置绑定以指向视图模型上的正确属性
  7. 作为一项规则

    1. 我从不使用ObjectDataProviders或在XAML中实例化任何东西(太多错误)
    2. 始终使用MVVM模式
    3. 注意静态资源 - 每个应用实例只能设置一次动态资源可以更新