【发布时间】:2014-11-18 21:15:00
【问题描述】:
有人可以帮我解决这个问题吗 我正在尝试将应用程序重组为 MVVM 并更好地利用数据绑定,但遇到了一个小问题。
我有一个视图模型类
public class MainWindowViewModel
{
public ObservableCollection<DiagramElement> Elements { get; set; }
public MainWindowViewModel()
{
AppMachineList = new ListOfMachines();
Elements = new ObservableCollection<DiagramElement>();
}
}
我在其中创建了 DiagramElement 类的 observablecollection。
public class DiagramElement : Button
{
private Item linkedItem;
public Item LinkedItem
{
get { return this.linkedItem; }
set
{
this.linkedItem = value;
this.DataContext = this;
this.Template = (ControlTemplate)FindResource("ItemTemplate");
}
}
DiagramElement 类只是扩展了按钮类并添加了自己的 controlTemplate。
回到我的 MainWindow.xaml.cs 类,我实例化视图模型,然后从 ObservableCollection 填充 MainWindow.xaml 中的堆栈面板。
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
MainWindowViewModel vm = new MainWindowViewModel();
vm.LoadMachines();
foreach(DiagramElement d in vm.Elements)
{
ItemList.Children.Add(d);
}
}
}
<StackPanel x:Name="ItemList" Orientation="Vertical"></StackPanel>
我想要做的是,取消 foreach 循环和对 ItemList.Children.Add() 的调用。并将其替换为与视图模型中元素的绑定,如下所示。
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
MainWindowViewModel vm = new MainWindowViewModel();
vm.LoadMachines();
this.DataContext = vm;
}
}
<StackPanel x:Name="ItemList" DataContext="{Binding Path=Elements}"</Stackpanel>
我无法将要添加到 Stackpanel 的元素,绑定不起作用。感谢您提供任何帮助。
【问题讨论】:
-
你误解了 MVVM 的概念。 UI 的东西不应该出现在 ViewModel 中。它仅用于保存数据而不是 UI 控件(在您的情况下为按钮)。
-
是的,这些按钮最初是在 MainWindow 中创建的。我试图解决一些问题并将它们移到视图模型中。感谢您的回复。
标签: wpf data-binding