C# 如何使最简单的viewmodel工作?
我试图理解如何使用viewmodel将数据绑定到wpf窗口,但找不到任何简单的示例或解释 这就是我到目前为止所做的: ViewModel.csC# 如何使最简单的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() {
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
<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更有意义了!