1

我有一个包含 4 列的 DataGrid,其中前两列绑定到一个对象。另外两个是按钮列是这样制作的

<DataGridTemplateColumn  MaxWidth="100" Header="Delete">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Name="BtnDelete" CommandParameter="{Binding Path=Id}" Content="Delete" Click="BtnDeleteEmployee_Click" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我的 Datagrid 有 CanUserAddRows="True" ,它总是在网格底部生成一个空行。但是,我希望在填充其他行之前禁用底行上的两个按钮。就像现在一样,当我单击按钮时,我(当然)得到了一个 nullreferenceexception。

我想一个解决方案是将按钮的 IsEnabled 属性绑定到

id>0

但是如何做到这一点,我不确定。

4

3 回答 3

1

实现此目的的一种方法是将IsEnabled属性绑定到 Id 属性并使用 ValueConverter 根据您的条件重新调整 True 或 False。

值转换器可能如下所示:

public class IdToEnabledConverter:IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    return value != null && (int)value > 0;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}

并且您在资源部分中引用它:

<Grid.Resources>
  <local:IdToEnabledConverter x:Key="IdToEnabledConverter"/>
</Grid.Resources>

并绑定IsEnabled属性:

<Button IsEnabled="{Binding Id, Converter={StaticResource IdToEnabledConverter}}"/>
于 2012-05-29T09:32:25.797 回答
1

我建议使用 MVVM 模式和命令。如果您使用带有按钮的命令,它将根据 CanExecute() 返回值自动禁用。所以这是一个你可以检查 id > 0 的地方。

有关命令的一些有用信息: http ://relentlessdevelopment.wordpress.com/2010/03/30/simplified-mvvm-commanding-with-delegatecommand/

于 2012-05-29T09:35:55.410 回答
1

您可以使用样式触发器如下

 <Button.Style>
     <Style TargetType="{x:Type Button}">
         <Setter Property="Visibility" Value="Visible"/>
         <Style.Triggers>
              <DataTrigger Binding="{Binding Id}" Value="{x:Null}">
                   <Setter Property="Visibility" Value="Hidden"/>
              </DataTrigger>
         </Style.Triggers>
     </Style>
</Button.Style>

此示例在值为Idnull 时完全隐藏按钮。但同样可以使用 IsEnabled 属性来禁用按钮

于 2019-03-19T04:38:28.017 回答