首页 > 解决方案 > 如何在 WPF 中显示不同对象(子对象)的列表并将列表内的按钮绑定到每一行?

问题描述

如何在 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>

在视图模型中:

    #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

标签: c#wpfxamlmvvm

解决方案


您可以绑定 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();
    }
}

推荐阅读