c# - 如何在 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
解决方案
您可以绑定 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();
}
}
推荐阅读
- snowflake-cloud-data-platform - 雪花像另一个表一样创建表,但将所有列设置为可为空
- python - Python:如何同时执行 100 个进程?
- node.js - 安装带有 EACCES 符号链接错误的 expo-cli
- javascript - 运行存储在对象中的函数
- webgl - 将单个纹理的子集渲染到 WebGL 画布上的最快方法是什么?
- time - 如何在时间 x 后改变形状的颜色?
- ios - Xcode 应用程序
- latex - 如何不平衡乳胶中的书目列?
- c - 假设 realloc()ing 到较小的大小总是会成功,这是否安全?
- reactjs - Firebase 数据未保存到我的反应状态