Как получить доступ к родительской viewmodel из ListView.ItemTemplate? - PullRequest
0 голосов
/ 23 июня 2019

У меня есть этот простой ListView заполненный из ObservableCollection. Как только список будет связан, я хотел бы получить доступ к родительской модели представления vm изнутри этого ItemTemplate, чтобы я мог связать команду с именем 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}"/>

Ответы [ 3 ]

0 голосов
/ 23 июня 2019

Я делаю это из кода, к сожалению ... Я скоро выложу пример моего кода

0 голосов
/ 25 июня 2019

Вы можете определить свою команду в своей модели и объявить в ней событие. В вашей ViewModel, когда вы инициализируете коллекцию 'meshes', вы можете зарегистрировать это событие для каждого элемента в этой коллекции. Затем, когда команда выполняется, вам просто нужно вызвать событие и выполнить некоторые операции в его обработчике событий.

Я сделал простой пример кода для справки:

<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();
        }
    }
}

Пожалуйста, обратите внимание , что ViewModelBase и RelayCommand относятся к mvvmlight .

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
0 голосов
/ 23 июня 2019

Вы можете сделать так:

<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}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...