我试图了解如何使用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连接到实际数据?
答案 0 :(得分:3)
代码中的错误:
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>();
}