【问题标题】:Disabling button in bottom row in a wpf datagrid禁用 wpf 数据网格中底行的按钮
【发布时间】:2012-05-29 09:25:40
【问题描述】:

我有一个包含 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>

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

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

id>0

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

【问题讨论】:

    标签: c# wpf data-binding datagrid


    【解决方案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}}"/>
    

    【讨论】:

    • 你能详细说明一下吗? - 我对 WPF 有点陌生
    • 我认为这是个好主意,但每当我尝试编辑自动生成行中的单元格时,都会收到 InvalidCastException。 “指定的演员表无效。”
    • 这正是我的想法。我做了以下事情: if (value == null) return false;返回((int)值)> 0;但它没有用。我仍然遇到异常。
    • 嗯,首先,这是您获得异常的地方吗?如果是这样,您的 Id 属性的数据类型是什么?此外,设置一个断点,检查值并相应地调整您的转换/投射以应对即将发生的事情。
    • 数据类型为int,return ((int)value) > 0时抛出异常; datagrids itemsource 是来自 SqlDataAdapter 的 DataTable。 DataGrid 会在数据表中生成一个新行,其 ID 比上一个大吗?那么这将不起作用。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

       <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>
      

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

      【讨论】:

        猜你喜欢
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 2018-09-27
        • 2011-02-23
        • 2011-12-14
        相关资源
        最近更新 更多