Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF数据绑定到observableCollection_Wpf_Data Binding - Fatal编程技术网

WPF数据绑定到observableCollection

WPF数据绑定到observableCollection,wpf,data-binding,Wpf,Data Binding,谁能帮我做这个吗 我正在尝试将一个应用程序重新组织到MVVM,并更好地利用数据绑定,但遇到了一个小问题 我有一个viewmodel类 public class MainWindowViewModel { public ObservableCollection<DiagramElement> Elements { get; set; } public MainWindowViewModel() { AppMachineList = new L

谁能帮我做这个吗 我正在尝试将一个应用程序重新组织到MVVM,并更好地利用数据绑定,但遇到了一个小问题

我有一个viewmodel类

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>