如何使最简单的viewmodel工作?

时间:2016-02-24 10:36:34

标签: c# wpf mvvm

我试图了解如何使用viewmodel将数据绑定到wpf窗口,但找不到任何简单的示例或解释如何实现。

这是我到目前为止所做的:

ViewModel.cs

public class ViewModel
{
    public string Info = "Infoo";
}

MainWindow.xaml.cs

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }

MainWindow.xaml

<Window x:Class="PeopleApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PeopleApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="212,137,0,0" TextWrapping="Wrap" Text="{Binding Info}" VerticalAlignment="Top" Width="120"/>

    </Grid>
</Window>

为什么文本框不显示“Infoo”?我错过了什么?

修改

我已将ViewModel中的字段更改为属性,但如何将ViewModel连接到实际数据?

2 个答案:

答案 0 :(得分:3)

代码中的错误:

  • 您需要在VM上拥有属性而不是公共字段。
  • 您需要先设置VM实例属性的值,然后再将其分配给DataContext MainWindow

这应该有用。

<强> MainWindow.xaml

<Window x:Class="PeopleApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PeopleApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>       
            <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="212,137,0,0" TextWrapping="Wrap" Text="{Binding Info}" VerticalAlignment="Top" Width="120"/>        
    </Grid>
</Window>

<强> MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {         
        InitializeComponent();
        this.DataContext = new ViewModel() { Info = "Infoo" };
    }    
}

<强> ViewModel.cs

public class ViewModel
{
    public string Info { get; set; }        
}

答案 1 :(得分:-1)

您的视图(窗口)和ViewModel(类)是应用程序的各个部分。您应该使用DataContext属性在View和ViewModel之间进行交互并创建属性,而不是像您一样在您的情况下完成的字段。例如:

查看:

<Grid>        
    <TextBlock Text="{Binding DisplayTime}" />        
</Grid>

<强>视图模型:

public class MyViewModel
{
    private string displayTime=DateTime.Now.ToString;
    public string DisplayTime
    {
        get { return displayTime; }
        set { displayTime = value; }
    }
}

设置DataContext有很多种方法:

第一种方法。在视图中:

<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>

第二种方法。您应该覆盖App.xaml.cs的OnStartUp()方法

public partial class App : Application
{
     protected override void OnStartup(StartupEventArgs e)
    {
            base.OnStartup(e);
            MainWindow app = new MainWindow();
            ProductViewModel context = new ProductViewModel();
            app.DataContext = context;
            app.Show();
     }
}

第三种方法。在Windows的构造函数中:

public partial class MainWindow : Window
{
     public MainWindow()
     {
          InitializeComponent();
          DataContext=new MainWindowViewModel();
     }
}

第四种方法。您可以通过UnityContainer通过DependencyInjection设置DataContext。但DependencyInjection,Prism和UnityContainer是其他问题,并且从这个问题的范围出发。仅举例:

protected override void RegisterTypes()
{ 
    unityContainer.RegisterType<object, ItemControl>("ModuleAUpper");
    unityContainer.RegisterType<IViewModelItemControl, ViewModelItemControl>();
    unityContainer.RegisterTypeForNavigation<ItemControl>();
}