【问题标题】:Button disabling not working wpf按钮禁用不工作wpf
【发布时间】:2017-06-12 22:40:57
【问题描述】:

如果在 datagrid 中没有选择任何内容,我正在尝试禁用 xaml 中的按钮,但它不起作用,我不知道为什么。

这是我的 xaml 代码:

    <DataGrid IsReadOnly="True" x:Name="datagrid" ItemsSource="
     {Binding Path=Notes, UpdateSourceTrigger=PropertyChanged}"  
       IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Left" 
    Margin="0,39,0,0" VerticalAlignment="Top" Height="175" Width="300" AutoGenerateColumns="False">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="DataGridColumnHeader">
                <Setter Property="FontSize" Value="14"/>
            </Style>
        </DataGrid.ColumnHeaderStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Title"  Binding="{Binding Title}"/>
            <DataGridTextColumn Header="Content" Binding="{Binding Content}"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Edit" HorizontalAlignment="Left" Margin="218,9,0,0" VerticalAlignment="Top" Width="70" Height="25"
            Command="{Binding editCommand}">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="True" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=datagrid, Path=SelectedItem}" Value="{x:Null}">
                        <Setter Property="IsEnabled" Value="False" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
        <Button.CommandParameter>
            <MultiBinding Converter="{StaticResource multiCloner}">
                <Binding Path="SelectedItem" ElementName="datagrid"/>
            </MultiBinding>
        </Button.CommandParameter>
    </Button>

如果有人能帮忙,我将不胜感激。

编辑:我使用的是 MVVM,所以没有代码隐藏。 显然,数据网格中的第一项总是自动选择,这就是为什么按钮总是启用但我仍然不知道我做了什么让第一项总是被选中。

【问题讨论】:

  • 您能否更具体地说明它是如何“不工作”的?您是否确认 dataGrid.SelectedItem 实际上为 null?
  • 好吧,我刚刚检查了它,即使我没有点击任何东西,但第一个项目总是自动被选中。有办法改变吗?

标签: wpf xaml button datagrid


【解决方案1】:

我想通了。我刚刚删除了

          IsSynchronizedWithCurrentItem="True" 

一切正常。

【讨论】:

    【解决方案2】:

    您的按钮命令绑定可能存在干扰。按钮绑定的Command有一个基于ICommand接口的CanExecute()函数。这会根据 CanExecute() 的真/假返回自动启用和禁用按钮。您可以暂时取消命令,看看这是否是罪魁祸首——我怀疑它是。然后,如果您想保留 Command,可以将 Command CanExecte() 返回值基于 datagrid SelectedItem != null,并且您根本不需要 IsEnabled 按钮的触发器。

    【讨论】:

      【解决方案3】:

      尝试将这些东西放在代码隐藏中,而不是拥有所有这些 setter 属性。

      if (Nothing Selected In Datagrid)
      {
      Button1.IsEnabled = false;
      }
      else
      {
      Button1.IsEnabled = true;
      }
      

      还要确保为按钮命名并将Button1 替换为名称。

      【讨论】:

      • 我正在使用 MVVM,所以我不应该在代码隐藏中包含任何内容。
      • 我不能,MVVM 是任务,这不是我的选择。
      • 您在 Visual Studio 中吗?智能感知怎么说?
      • 是的,但我还在学习,所以我不太清楚那是什么或如何使用它。
      • 我也很确定你根本不需要 button.style 元素。您也可以删除 style.triggers。
      猜你喜欢
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2014-10-13
      相关资源
      最近更新 更多