Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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 MVVM DataTemplate:使用父ViewModel中的数据注入模板ViewModel_Wpf_Mvvm_View_Viewmodel_Datatemplate - Fatal编程技术网

WPF MVVM DataTemplate:使用父ViewModel中的数据注入模板ViewModel

WPF MVVM DataTemplate:使用父ViewModel中的数据注入模板ViewModel,wpf,mvvm,view,viewmodel,datatemplate,Wpf,Mvvm,View,Viewmodel,Datatemplate,我在父视图模型中有一个ObservableCollection,我想在父视图中显示它。所以我定义了一个子视图和一个子视图模型来处理按钮点击。 如何将ObservableCollection中的每个项目放入相应的子ViewModel中,而不丢失用于按钮单击处理的已设置的Relay命令 在我的父视图代码中,我唯一要做的就是将DataContext设置为适当的ViewModel: DataContext = new ParentViewModel(); private ObservableColle

我在父视图模型中有一个ObservableCollection,我想在父视图中显示它。所以我定义了一个子视图和一个子视图模型来处理按钮点击。 如何将ObservableCollection中的每个项目放入相应的子ViewModel中,而不丢失用于按钮单击处理的已设置的Relay命令

在我的父视图代码中,我唯一要做的就是将DataContext设置为适当的ViewModel:

DataContext = new ParentViewModel();
private ObservableCollection<Item> items;
public ObservableCollection<Item> Items
{
  get { return items; }
  set
  {
    items= value;
    OnPropertyChanged("Items");
  }
}

... //Filling the Collection in Constructor
在我的父视图XAML中,我定义了一个列表框来显示我的子视图的数据模板:

<ListBox
  ItemsSource="{Binding Path=Items}">
  <ListBox.ItemTemplate>
    <DataTemplate DataType="{x:Type vm:ChildViewModel}">
      <views:ChildView Width="auto" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>
现在,当我添加

DataContext = new SampleItemViewModel();
对于构造函数,按钮点击被处理,但是文本框都是空的。 当我删除这一行时,文本框被正确填充,但是按钮点击没有被处理

如何让这两个功能都工作

编辑:

ParentViewModel:

DataContext = new ParentViewModel();
private ObservableCollection<Item> items;
public ObservableCollection<Item> Items
{
  get { return items; }
  set
  {
    items= value;
    OnPropertyChanged("Items");
  }
}

... //Filling the Collection in Constructor
私有可观察收集项目;
公共可观测收集项目
{
获取{返回项;}
设置
{
项目=价值;
不动产变更(“项目”);
}
}
... //在构造函数中填充集合
ChildViewModel只包含上述按钮单击处理程序

编辑:


我现在尝试了几种方法,但我不知道如何将命令从ChildView绑定到我的ChildViewModel,而不将我的ChildView的DataContext设置为我的ChildViewModel

您可以删除事件触发器,因为Button具有命令属性

<TextBlock Text="{Binding Path=Title}" />
...
<Button
  Content="Start exe"
  Tag="{Binding Path=ExePath}"
  Command="{Binding Path=OnButtonClicked}"
>
</Button>

...
并设置数据上下文:

<ListBox
  ItemsSource="{Binding Path=Items}">
  <ListBox.ItemTemplate>
    <DataTemplate DataType="{x:Type vm:ChildViewModel}">
      <views:ChildView Width="auto" DataContext="{Binding}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>


但是如何使用集合项中的数据处理ChildViewModel中的按钮单击事件?删除DataContext=new SampleItemViewModel();从后面的子视图代码中,按照mathieu的指示删除该行,并尝试执行mathieu指示的操作,但我无法使命令正常工作,因此执行了ObservionButtonClicked,但我在ChildViewModel中没有数据,我只在视图中获得了集合中每个项目的数据现在数据在ChildView中正确显示,但是按钮单击命令没有执行