【问题标题】:WPF MultiDataTrigger AND conditionWPF MultiDataTrigger AND 条件
【发布时间】:2015-11-06 01:46:53
【问题描述】:

我只想在我的两个数据网格都选择项目时启用按钮。现在,当任何一个数据网格有选择时,它就会启用。有什么想法吗?

<Button x:Name="button" Content="Z" Grid.Column="1" Margin="0,240,0,0" VerticalAlignment="Top" FontFamily="Wingdings 3" FontSize="21.333" ToolTip="Set the selected alarm for the selected alarm time">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="True" />
            <Setter Property="Opacity" Value="1" />
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding ElementName=alarmProfilesDataGrid, Path=SelectedItem}" Value="{x:Null}"/>
                        <Condition Binding="{Binding ElementName=alarmFilesDataGrid, Path=SelectedItem}" Value="{x:Null}"/>
                    </MultiDataTrigger.Conditions>
                    <MultiDataTrigger.Setters>
                        <Setter Property="IsEnabled" Value="False" />
                        <Setter Property="Opacity" Value=".5" />
                    </MultiDataTrigger.Setters>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

【问题讨论】:

  • 也许你应该尝试使用 wpf 命令。

标签: c# wpf datagrid multidatatrigger


【解决方案1】:

您的代码会发生以下情况: 当任何一个数据网格都有选择时,两个条件都不是正确的,而是仅当两个数据网格都没有选择时才满足条件。

程序启动时,两个数据网格都为空,因此满足您的条件。现在,如果您在任一网格中进行选择,则永远不会满足您的条件,IsEnabled 的值仍然是True,即原始值。

要纠正这个问题,您需要一个转换器:

public class NotNullToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool result = value == null ? false : true;

        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

<Style TargetType="Button">
    <Setter Property="IsEnabled" Value="False" />
    <Setter Property="Opacity" Value=".5" />
    <Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding ElementName=alarmProfilesDataGrid, Path=SelectedItem, Converter={StaticResource NotNullToBoolConverter}}" Value="True"/>
        <Condition Binding="{Binding ElementName=alarmFilesDataGrid, Path=SelectedItem, Converter={StaticResource NotNullToBoolConverter}}" Value="True"/>
        </MultiDataTrigger.Conditions>
        <MultiDataTrigger.Setters>
        <Setter Property="IsEnabled" Value="True" />
        <Setter Property="Opacity" Value="1" />
        </MultiDataTrigger.Setters>
    </MultiDataTrigger>
    </Style.Triggers>
</Style>

【讨论】:

    【解决方案2】:

    我相信正确的方法是使用属性绑定和绑定到按钮的具有 CanExecute 条件的命令。

    public RelayCommand SaveCommand { get; set; }
    
    SaveCommand = new RelayCommand();
    SaveCommand.Action = () => { Save(SelectedObject1,SelectedObject2); };
    SaveCommand.CanExecute = () => { SelectedObject1 != null && SelectedObject2 != null) };
    

    XAML:

    <DataGrid SelectedItem="{Binding Path=SelectedObject1}">
    </DataGrid>
    <DataGrid SelectedItem="{Binding Path=SelectedObject2}">
    </DataGrid>
    <Button Context="Save" Command="{Binding SaveCommand}/>
    

    这将仅在从每个网格中选择两个对象时启用按钮。

    PS:此代码无效,但您可以找到如何在 SO 上使用 RelayCommand。请在 SO 上搜索一些 RelayCommand 实现。

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多