Как показать список различных объектов (дочерних элементов) в WPF и привязать кнопку внутри списка к каждой строке? - PullRequest
0 голосов
/ 05 апреля 2019

Как показать список различных объектов (дочерних элементов) в WPF и привязать кнопку внутри списка к каждой строке? У меня есть 4 класса: человек (родитель), студент (ребенок человека), персонал (ребенок человека), учитель (ребенок персонала)

В представлении:

<ListView Grid.Row="0"  Name="List" HorizontalContentAlignment="Center" ItemsSource="{Binding Path=PeopleList}" SelectedItem="{Binding RowSelectedItem, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Single">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Width="180" x:Name="Column_Type" 
                                    DisplayMemberBinding="{Binding Type}" />
                    <GridViewColumn Width="180"
                                    DisplayMemberBinding="{Binding FullName}" />
                    <GridViewColumn Width="180">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <dx:SimpleButton Content="SELECT" Width="180" Command="{Binding DataContext.SelectCommand, ElementName=Column_Type}" CommandParameter="{Binding ElementName=Column_Type, Path=Type}"/>

                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

в ViewModel:

    #region Select

    DelegateCommand<Person> selectCommand;
    public DelegateCommand<Person> SelectCommand
    {
        get => selectCommand ??
               (selectCommand = new DelegateCommand<Person>(Select, CanSelect));
    }
    public bool CanSelect(Person rowItemType)
    {
        if (rowItemType.Type == "Teacher" || rowItemType.Type == "Student")
            return true;
        else
            return false;
    }
    public void Select(Person selectedItem)
    {
     //if(RowSelectedItem.Type == "Staff")
     //   RowSelectedItem.
        //Refresh();
    }

    #endregion

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Вы можете связать свойство IsEnabled и использовать конвертер,

в XAML:

<Button Content="SELECT"
    Width="180"
    IsEnabled="{Binding ., Converter={StaticResource TypeConverter}}" />

и новый конвертер:

public class TypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var isPerson = value is Person;
        return isPerson;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
0 голосов
/ 05 апреля 2019

Это очень упрощенный ответ, ваш сценарий, скорее всего, будет гораздо более сложным, но он иллюстрирует то, что я написал в комментарии выше.

MainWindow.xaml

<Window x:Class="TestWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="450"
        Width="800">
    <Grid>
        <ListView HorizontalContentAlignment="Center" ItemsSource="{Binding Path=PeopleList}" SelectionMode="Single">
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Width="180" DisplayMemberBinding="{Binding Type}" />
                        <GridViewColumn Width="180" DisplayMemberBinding="{Binding FullName}" />
                        <GridViewColumn Width="180">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <Button Content="SELECT" Width="180" Command="{Binding SelectCommand}" />
                                    </StackPanel>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Collections.ObjectModel;
using System.Windows;

namespace TestWpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public Collection<object> PeopleList => new Collection<object>
        {
            new Person(),
            new Student(),
            new Person(),
            new Student()
        };
    }
}

Person.cs

using System;
using Prism.Commands;

namespace TestWpfApplication
{
    internal class Person
    {
        DelegateCommand selectCommand;

        public string Type => "Person";

        public string FullName => "My name is person";

        public DelegateCommand SelectCommand
        {
            get => selectCommand ?? (selectCommand = new DelegateCommand(Select, CanSelect));
        }
        public bool CanSelect()
        {
            return true;
        }

        public void Select()
        {
            Console.WriteLine("Person Clicked");
        }
    }
}

Student.cs

using System;
using Prism.Commands;

namespace TestWpfApplication
{
    internal class Student
    {
        DelegateCommand selectCommand;

        public string Type => "Student";

        public string FullName => "My name is student";

        public DelegateCommand SelectCommand
        {
            get => selectCommand ?? (selectCommand = new DelegateCommand(Select, CanSelect));
        }

        public bool CanSelect()
        {
            return false;
        }

        public void Select()
        {
            Console.WriteLine("Student Clicked");
        }
    }
}

Если вы хотите, чтобы какая-то логика выполнялась в MainWindow.xaml.cs , вы можете иметь событие в Person.cs & Student.cs и «подключите» их, когда объекты будут созданы и добавлены в коллекцию PeopleList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...