• 根据行元素值,控制单元格菜单是否显示


    在实际应用中我们经常需要针对不同的内容显示不同的菜单项,这里将解决方式总结记录下:

    实现的目的是:当行元素 “Mandatory” 的取值为 “H” 的时候,显示菜单项 “DB Owner” 和 “Table Name”,取其他值的时候则不显示这两个菜单项。(其他判断条件可以采用类似的方式处理)

    解决方式: 设置 BarButtonItem 的 “ IsVisible ” 属性值

    实现方式:

    1. 通过数据绑定的方式实现:

    <dxb:BarButtonItem Content="Table Name" IsVisible="{Binding Row.Row.Mandatory,Converter={StaticResource string2BoolConverter}}"
                       Command="{Binding Path=(dxg:DataControlBase.ActiveView).DataContext.SetTableDataHeaderCommand, RelativeSource={RelativeSource Self}}"
               CommandParameter="{Binding ElementName=tvTable, Path=FocusedRowHandle}">
    </dxb:BarButtonItem>

    注意这里需要使用一个 Converter, 将 Mandatory的字符串取值转换为 “ IsVisible ” 布尔值返回

    转换器代码如下:

    public class String2BoolConverter : BaseValueConverter
        {
            public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (!(value is string))
                    return null;
                if (value.ToString() == "H")
                    return true;
                if (value.ToString() == "Y" || value.ToString() == "N")
                    return false;
                return null;
            }
    
            public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new System.NotImplementedException();
            }
        }
        public abstract class BaseValueConverter : MarkupExtension, IValueConverter
        {
            public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
            public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            public sealed override object ProvideValue(IServiceProvider serviceProvider)
            {
                return this;
            }
        }

    2. 通过 DataTrigger 的方式实现

    <Style x:Key="barButtonItemStyle" TargetType="dxb:BarButtonItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Row.Row.Mandatory,Converter={StaticResource string2BoolConverter}}" Value="false">
                <Setter Property="IsVisible" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

    完整样例代码如下:

    <dxg:GridControl ItemsSource="{Binding GridData}" AutoGenerateColumns="AddNew">
        <dxg:GridControl.Columns>
            <dxg:GridColumn Header="ID" FieldName="ID"></dxg:GridColumn>
            <dxg:GridColumn Header="Text" FieldName="Text"></dxg:GridColumn>
            <dxg:GridColumn Header="Value" FieldName="Value"></dxg:GridColumn>
            <dxg:GridColumn Header="Mandatory" FieldName="Mandatory"></dxg:GridColumn>
        </dxg:GridControl.Columns>
        <dxg:GridControl.View>
            <dxg:TableView x:Name="tvTable" RowStyle="{StaticResource optimizedRowStyle}">
                <dxg:TableView.RowCellMenuCustomizations>
                    <dxb:BarButtonItem Content="DB Owner"
                                       Command="{Binding Path=(dxg:DataControlBase.ActiveView).DataContext.SetTableDataHeaderCommand, RelativeSource={RelativeSource Self}}"
                               CommandParameter="{Binding ElementName=tvTable, Path=FocusedRowHandle}"
                                       dxb:BarManager.ShowGlyphsInPopupMenus="False"
                                       Style="{StaticResource barButtonItemStyle}">
                    </dxb:BarButtonItem>
                    <dxb:BarButtonItem Content="Table Name" IsVisible="{Binding Row.Row.Mandatory,Converter={StaticResource string2BoolConverter}}"
                                       Command="{Binding Path=(dxg:DataControlBase.ActiveView).DataContext.SetTableDataHeaderCommand, RelativeSource={RelativeSource Self}}"
                               CommandParameter="{Binding ElementName=tvTable, Path=FocusedRowHandle}">
                    </dxb:BarButtonItem>
                    <dxb:BarButtonItem Content="DataHeader"
                                       Command="{Binding Path=(dxg:DataControlBase.ActiveView).DataContext.SetTableDataHeaderCommand, RelativeSource={RelativeSource Self}}"
                               CommandParameter="{Binding ElementName=tvTable, Path=FocusedRowHandle}">
                    </dxb:BarButtonItem>
                    <dxb:BarButtonItem Content="DataBegin"
                                            Command="{Binding Path=(dxg:DataControlBase.ActiveView).DataContext.SetTableDataBeginCommand, RelativeSource={RelativeSource Self}}"
                               CommandParameter="{Binding ElementName=tvTable, Path=FocusedRowHandle}">
                    </dxb:BarButtonItem>
                </dxg:TableView.RowCellMenuCustomizations>
                <dxmvvm:Interaction.Behaviors>
                    <dxmvvm:EventToCommand EventName="MouseDoubleClick"
                                   Command="{Binding ShowRowDetailsCommand}"
                                   PassEventArgsToCommand="True">
                        <dxmvvm:EventToCommand.EventArgsConverter>
                            <dx:EventArgsToDataRowConverter/>
                        </dxmvvm:EventToCommand.EventArgsConverter>
                    </dxmvvm:EventToCommand>
                </dxmvvm:Interaction.Behaviors>
            </dxg:TableView>
        </dxg:GridControl.View>
    </dxg:GridControl>
  • 相关阅读:
    objectMediator
    vi
    string regex
    ar
    widget class in class
    Makefile 语法分析 第三部分
    在Makefile中的 ".PHONY "是做什么的?
    】openssl移植Android使用及其相关经验分享
    精品Android源码推荐,看了绝不后悔
    Makefile 语法分析 第三部分
  • 原文地址:https://www.cnblogs.com/runningRain/p/13926880.html
Copyright © 2020-2023  润新知