Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使最简单的viewmodel工作?_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何使最简单的viewmodel工作?

C# 如何使最简单的viewmodel工作?,c#,wpf,mvvm,C#,Wpf,Mvvm,我试图理解如何使用viewmodel将数据绑定到wpf窗口,但找不到任何简单的示例或解释 这就是我到目前为止所做的: ViewModel.cs public class ViewModel { public string Info = "Infoo"; } MainWindow.xaml.cs public partial class MainWindow : Window { public MainWindow() {

我试图理解如何使用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”?我错过了什么

编辑:

<Grid>        
    <TextBlock Text="{Binding DisplayTime}" />        
</Grid>
public class MyViewModel
{
    private string displayTime=DateTime.Now.ToString;
    public string DisplayTime
    {
        get { return displayTime; }
        set { displayTime = value; }
    }
}
<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>
public partial class MainWindow : Window
{
     public MainWindow()
     {
          InitializeComponent();
          DataContext=new MainWindowViewModel();
     }
}
我已将ViewModel中的字段更改为属性,但如何将ViewModel连接到实际数据?

您的视图(窗口)和ViewModel(类)是应用程序的不同部分。您应该使用
DataContext
property在视图和ViewModel之间进行交互并创建属性,而不是像在您的案例中那样创建字段。例如:

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

<Grid>        
    <TextBlock Text="{Binding DisplayTime}" />        
</Grid>
public class MyViewModel
{
    private string displayTime=DateTime.Now.ToString;
    public string DisplayTime
    {
        get { return displayTime; }
        set { displayTime = value; }
    }
}
<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>
public partial class MainWindow : Window
{
     public MainWindow()
     {
          InitializeComponent();
          DataContext=new MainWindowViewModel();
     }
}
设置DataContext的方法有很多:

第一种方法。视图:

<Grid>        
    <TextBlock Text="{Binding DisplayTime}" />        
</Grid>
public class MyViewModel
{
    private string displayTime=DateTime.Now.ToString;
    public string DisplayTime
    {
        get { return displayTime; }
        set { displayTime = value; }
    }
}
<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>
public partial class MainWindow : Window
{
     public MainWindow()
     {
          InitializeComponent();
          DataContext=new MainWindowViewModel();
     }
}
第三种方法。在Windows的构造函数中:

<Grid>        
    <TextBlock Text="{Binding DisplayTime}" />        
</Grid>
public class MyViewModel
{
    private string displayTime=DateTime.Now.ToString;
    public string DisplayTime
    {
        get { return displayTime; }
        set { displayTime = value; }
    }
}
<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>
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>();
}
受保护的覆盖无效注册表类型()
{ 
unityContainer.RegisterType(“ModuleUpper”);
unityContainer.RegisterType();
unityContainer.RegisterTypeForNavigation();
}

代码中的错误:

<Grid>        
    <TextBlock Text="{Binding DisplayTime}" />        
</Grid>
public class MyViewModel
{
    private string displayTime=DateTime.Now.ToString;
    public string DisplayTime
    {
        get { return displayTime; }
        set { displayTime = value; }
    }
}
<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>
public partial class MainWindow : Window
{
     public MainWindow()
     {
          InitializeComponent();
          DataContext=new MainWindowViewModel();
     }
}
  • 您需要在VM上具有属性,而不是公共字段
  • 在将VM实例的属性分配给
    main窗口的
    DataContext
    之前,需要设置该属性的值
这应该行得通

main window.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>
ViewModel.cs

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

WPF数据绑定仅适用于公共属性。您的
公共字符串信息
是一个字段,而不是属性。从这里开始阅读:。谢谢@Clemens,这很有意义!但是如何将ViewModel中的属性连接到一个对象的属性,该对象包含一个实际包含数据的字符串属性?{Binding ObjectA.Info}“…找不到…”-我建议在internet上而不是在办公桌下查找。这是一个有很好文档记录的模式……30秒的搜索给了我这个信息,您也可以使用MVVM框架来简化数据绑定。它需要在开始时进行设置,但以后的使用非常简单。例如,这个博客展示了它是如何与Caliburn.Micro@downvoter一起工作的,它真的很有趣。你为什么投反对票?他要求一个最简单的视图模型来工作。不管怎样,你的答案很有趣。还有,我没有被否决,我不是被否决的选民,但我可以向你解释为什么它被否决,因为我过去就这么做了——你给了一个懒得用谷歌搜索的人一个答案,并且问了一个已经被回答了数百次的问题——从而促进了产生无用内容和把作业推给其他人的行为!我没有意识到我实际上必须拥有ViewModel的一个实例,并确保该实例从正确的位置获取信息。现在MVVM更有意义了!