WPF数据绑定到observableCollection
谁能帮我做这个吗 我正在尝试将一个应用程序重新组织到MVVM,并更好地利用数据绑定,但遇到了一个小问题 我有一个viewmodel类WPF数据绑定到observableCollection,wpf,data-binding,Wpf,Data Binding,谁能帮我做这个吗 我正在尝试将一个应用程序重新组织到MVVM,并更好地利用数据绑定,但遇到了一个小问题 我有一个viewmodel类 public class MainWindowViewModel { public ObservableCollection<DiagramElement> Elements { get; set; } public MainWindowViewModel() { AppMachineList = new L
public class MainWindowViewModel
{
public ObservableCollection<DiagramElement> Elements { get; set; }
public MainWindowViewModel()
{
AppMachineList = new ListOfMachines();
Elements = new ObservableCollection<DiagramElement>();
}
}
DiagrameElement类只是扩展了button类并添加了自己的controlTemplate
回到MainWindow.xaml.cs类中,我实例化了viewmodel,然后从ObservableCollection在MainWindow.xaml中填充一个stackpanel
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>
公共部分类主窗口
{
公共主窗口()
{
初始化组件();
MainWindowViewModel vm=新的MainWindowViewModel();
vm.LoadMachines();
foreach(vm.Elements中的diagramed元素)
{
项目列表。子项。添加(d);
}
}
}
我想做的是,去掉foreach循环和对ItemList.Children.Add()的调用。并将其替换为绑定到viewmodel中的元素,如下所示
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>
公共部分类主窗口
{
公共主窗口()
{
初始化组件();
MainWindowViewModel vm=新的MainWindowViewModel();
vm.LoadMachines();
this.DataContext=vm;
}
}
仅供参考,将ViewModel与一组UI元素(在您的例子中是按钮)结合使用违反了MVVM的原则——UI和模型不应该像这样混合在一起
但直接的问题是不能使用StackPanel——它是一个控制容器,但不支持绑定到项目列表。您需要使用某种类型的中继器,如ItemsControl
<ItemsControl ItemsSource="{Binding Path=Elements}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- your DiagramElement should go here, something like
<DiagramElement LinkedItem={Binding Path=SomePropertyOnYourRevisedElement} />
-->
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但还有更多的工作要做DiagrameElement
需要将LinkedItem
转换为DependencyProperty
(在线有很多这样的例子),Elements
需要是某种模型对象的列表,它只存储DiagrameElement所需的属性(没有UI内容)。您误解了MVVM的概念。UI内容不应存在于ViewModel中。它只用来保存数据,而不是UI控件(在您的例子中是按钮)。是的,按钮最初是在MainWindow中创建的。我试图解决一些问题,并将它们移动到视图模型。谢谢你的回复。嗨,保罗,谢谢你的回复,我做了一些类似于你在以前的项目中建议的事情,我想我可能把事情复杂化了。是,我打算从视图模型中删除UI集合。
<ItemsControl ItemsSource="{Binding Path=Elements}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- your DiagramElement should go here, something like
<DiagramElement LinkedItem={Binding Path=SomePropertyOnYourRevisedElement} />
-->
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>