【问题标题】:How to access the parent viewmodel from inside a ListView.ItemTemplate?如何从 ListView.ItemTemplate 中访问父视图模型?
【发布时间】:2019-06-25 14:20:30
【问题描述】:

我有这个简单的ListView 填充自ObservableCollection。绑定列表后,我想从 ItemTemplate 内部访问父视图模型 vm,以便绑定名为 cmd_delete_mesh 的命令。这是如何为 UWP Xaml 应用程序(不是 wpf)完成的?

<ListView x:Name="mesh_list" SelectedItem="{x:Bind vm.selected_mesh, Mode=TwoWay}" ItemsSource="{x:Bind vm.meshes}">
 <ListView.ItemTemplate>
  <DataTemplate>
   <ListViewItem>
     <Button Command="{Binding cmd_delete_mesh}"/>

【问题讨论】:

    标签: xaml uwp


    【解决方案1】:

    你可以这样做:

    <ListView x:Name="mesh_list" SelectedItem="{x:Bind vm.selected_mesh, Mode=TwoWay}"    ItemsSource="{x:Bind vm.meshes}">
     <ListView.ItemTemplate>
      <DataTemplate>
       <ListViewItem>
         <Button Command="{Binding ElementName=mesh_list, Path=DataContext.vm.cmd_delete_mesh}"/>
    

    【讨论】:

    • 对不起,我没有注意到“vm”是一个属性。我更新了示例。
    • 由于某种原因,这仍然没有触发我的命令。我很快就会发布我的完整示例。
    【解决方案2】:

    不幸的是,我是从代码中执行此操作的...我很快就会发布我的代码示例

    【讨论】:

      【解决方案3】:

      您可以在模型中定义命令并在其中声明事件。在您的 ViewModel 中,当您初始化“网格”集合时,您可以为该集合中的每个项目注册此事件。然后,当命令执行时,您只需要引发事件并在其事件处理程序中进行一些操作。

      我做了一个简单的代码示例供大家参考:

      <ListView x:Name="mesh_list" SelectedItem="{x:Bind ViewModel.selected_mesh, Mode=TwoWay}" ItemsSource="{x:Bind ViewModel.meshes,Mode=OneWay}">
              <ListView.ItemTemplate>
                  <DataTemplate x:DataType="local:SubTest">
                      <ListViewItem>
                          <StackPanel Orientation="Horizontal">
                              <TextBlock Text="{x:Bind Name }"></TextBlock>
                              <Button Command="{x:Bind cmd_delete_mesh}" Content="delete"/>
                          </StackPanel>
                      </ListViewItem>
                  </DataTemplate>
              </ListView.ItemTemplate>
      </ListView>
      
      public sealed partial class MainPage : Page
      {
          public MainPage()
          {
              this.InitializeComponent();
              ViewModel = new Test("test data");
          }
          private Test ViewModel { get; set; }
      }
      
      public class Test : ViewModelBase
      {
          public string Name { get; set; }
      
          private SubTest _selected_mesh;
      
          public SubTest selected_mesh
          {
              get { return _selected_mesh; }
              set
              {
                  if (_selected_mesh != value)
                  {
                      _selected_mesh = value;
                      RaisePropertyChanged("selected_mesh");
                  }
              }
          }
      
          public ObservableCollection<SubTest> meshes { get; set; } = new ObservableCollection<SubTest>();
      
          public Test(string name)
          {
              this.Name = name;
              for (int i = 0; i < 10; i++)
              {
                  var sub = new SubTest() { Name = "String " + i };
                  sub.DeleteParentItem += Test_DeleteParentItem;
                  meshes.Add(sub);
              }
          }
      
          private void Test_DeleteParentItem()
          {
              if (selected_mesh != null)
              {
                  DeleteItem(selected_mesh);
              }
          }
      
          private void DeleteItem(SubTest subTest)
          {
              //TODO...
          }
      }
      
      public class SubTest
      {
          public RelayCommand cmd_delete_mesh { get; set; }
      
          public string Name { get; set; }
      
          public event Action DeleteParentItem;
      
          public SubTest()
          {
              cmd_delete_mesh = new RelayCommand(DeleteItem);
          }
      
          private void DeleteItem()
          {
              if (DeleteParentItem != null)
              {
                  DeleteParentItem.Invoke();
              }
          }
      }
      

      注意ViewModelBaseRelayCommand 来自mvvmlight

      using GalaSoft.MvvmLight;
      using GalaSoft.MvvmLight.Command;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-24
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 2019-10-03
        相关资源
        最近更新 更多