我正在尝试使用WPF MVVM。我在XAML中编写了以下代码
<UserControl x:Class="Accounting.Menu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Accounting"
mc:Ignorable="d"
d:DesignHeight="105" d:DesignWidth="300">
<UserControl.DataContext>
<local:MenuViewModel/>
</UserControl.DataContext>
<StackPanel>
<StackPanel>
<TextBlock Text="{Binding Path=MenuHeader}"/>
</StackPanel>
<ListBox ItemsSource="{Binding Path=MenuItems}" Height="70"/>
</StackPanel>
</UserControl>
我有MenuViewModel
个属性MenuHeader
和MenuItems
。我在运行时在属性中获取值。前者绑定到TextBlock
的文本,后者绑定到ListBox
的ItemSource。但是当我运行解决方案时,TextBlock和ListBox都是空的。
编辑:ViewModel代码
public class MenuViewModel: ViewModelBase
{
AccountingDataClassesDataContext db;
private string _menuType;
public string MenuHeader { get; set; }
public ObservableCollection<string> MenuItems { get; set; }
public MenuViewModel()
{
}
public MenuViewModel(string menuType)
{
this._menuType = menuType;
db = new AccountingDataClassesDataContext();
if (menuType == "Vouchers")
{
var items = db.Vouchers.OrderBy(t => t.VoucherName).Select(v => v.VoucherName).ToList<string>();
if (items.Any())
{
MenuItems = new ObservableCollection<string>(items);
MenuHeader = "Vouchers";
}
}
else
{
System.Windows.MessageBox.Show("Menu not found");
}
}
}
提前致谢。
答案 0 :(得分:3)
您正在使用ViewModel的默认构造函数在XAML中创建ViewModel,该构造函数不执行任何操作。所有人口代码都在非默认的构造函数中,永远不会被调用。
更常见的方法是在代码中创建ViewModel,并使用View.DataContext = ViewModel
显式地将其注入视图,或者使用DataTemplate进行impllcitly。
答案 1 :(得分:1)
我认为你必须触发OnPropertyChanged事件。我不确定您是否使用MVVM库(因为您从ViewModelBase继承,您可能正在使用MVVM Light),在那里它们将OnPropertyChanged包装在RaisePropertyChanged事件处理程序中。 触发事件将通知WPF更新UI。
string m_MenuHeader;
public string MenuHeader
{
get
{
return m_MenuHeader;
}
set
{
m_MenuHeader=value; OnPropertyChanged("MenuHeader");
}
}