如何在数据网格的特定行上启用特定按钮

How to enable a specific button on a specific row of a datagrid

我想为 DataGrid 的特定行启用 Button 并在后面的代码中为其他行禁用它。问题是 IsEnabled 属性 影响所有行中的所有按钮,这不是我想要的。它不能有两个不同的值(同时对某些行可见,对其他行折叠)

你能帮帮我吗?

这是我的 xaml :

<DataGrid ItemsSource="{Binding TaskUsers}" Name="DgUser" AutoGenerateColumns="False"  IsReadOnly="True" SelectionUnit="FullRow" SelectionMode="Single" CanUserAddRows="False" CanUserSortColumns="False" SelectedValuePath="TaskUserId" >
   <DataGrid.Columns>
       <DataGridTemplateColumn>
             <DataGridTemplateColumn.HeaderTemplate>
                   <DataTemplate>
                        <Button  BorderThickness="0" ToolTip="Subscribe" Click="AddTaskUser_OnClick">
                            <Image Source="/Sinergi;component/Images/add-icon16.png"/>
                        </Button>
                   </DataTemplate>
             </DataGridTemplateColumn.HeaderTemplate>
             <DataGridTemplateColumn.CellTemplate>
                   <DataTemplate>
                        <Button BorderThickness="0" ToolTip="Delete a User" Click="DeleteTaskUser_OnClick" Name="DeleteUserButton" Loaded="DeleteUserButton_OnLoaded">
                              <Image Source="/Sinergi;component/Images/Trash-can-icon16.png" />
                        </Button>
                   </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>

      <DataGridTextColumn Header="UserName" Binding="{Binding User.Name}"  />
  </DataGrid.Columns>

这是我的代码背后的代码

private void DeleteUserButton_OnLoaded(object sender, RoutedEventArgs e)
    {
        var delete = sender as Button;
        if (delete == null) return;
        foreach (var item in DgUser.Items)
        {
            var o = (TaskUser) item;
            if (o.UserId == Identity.This.OnBehalfOfUser.UserId) continue;
            delete.IsEnabled = false;
            delete.Visibility = Visibility.Collapsed;
        }
    }

您应该将 ButtonIsEnabled 属性 绑定到 TaskUser 对象的 属性 并摆脱 DeleteUserButton_OnLoaded 事件处理程序:

<DataTemplate>
    <Button BorderThickness="0" ToolTip="Delete a User" Click="DeleteTaskUser_OnClick" Name="DeleteUserButton">
        <Button.Style>
            <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding UserId}" Value="{x:Static local:Identity.This.OnBehalfOfUser.UserId}">
                        <Setter Property="IsEnabled" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
        <Button.Content>
            <Image Source="/Sinergi;component/Images/Trash-can-icon16.png" />
        </Button.Content>
    </Button>
</DataTemplate>

您需要将 DataTriggerValue 设置为任何 Identity.This.OnBehalfOfUser.UserId,或者使用值转换器:

<DataTemplate>
    <DataTemplate.Resources>
        <local:Converter x:Key="converter" />
    </DataTemplate.Resources>
    <Button BorderThickness="0" ToolTip="Delete a User" Click="DeleteTaskUser_OnClick" Name="DeleteUserButton">
        <Button.Style>
            <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding UserId, Converter={StaticResource converter}}" Value="False">
                        <Setter Property="IsEnabled" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
        <Button.Content>
            <Image Source="/Sinergi;component/Images/Trash-can-icon16.png" />
        </Button.Content>
    </Button>
</DataTemplate>

转换器:

class Converter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == Identity.This.OnBehalfOfUser.UserId;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}