Как включить определенную кнопку в определенной строке сетки данных - PullRequest
0 голосов
/ 11 мая 2018

Я хотел бы включить Button для конкретной строки DataGrid и отключить ее для других строк кода. Дело в том, что свойство 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;
        }
    }

1 Ответ

0 голосов
/ 11 мая 2018

Вам следует связать свойство IsEnabled Button со свойством объекта 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>

Вам необходимо установитьValue из DataTrigger до значения 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();
    }
}
...