欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF IValueConverter and IMultiValueConverter

程序员文章站 2022-03-22 22:14:04
1. 实现DataGrid column的显示和隐藏功能; (1). 定义ContextMenu ,该ContextMenu仅可使用于DataGrid的DataGridColumnHeader; (2). 自定义显示隐藏的制转换器; 2. 在实现DataGridColumn Filter 功能时,可 ......

1. 实现DataGrid column的显示和隐藏功能;

  (1). 定义ContextMenu ,该ContextMenu仅可使用于DataGrid的DataGridColumnHeader;

            <ContextMenu x:Key="StudyDataGridHeaderContextMenu" ItemsSource="{Binding Columns, 
                RelativeSource={RelativeSource AncestorLevel=1, AncestorType={x:Type DataGrid}, Mode=FindAncestor}}">
                <ContextMenu.ItemTemplate>
                    <DataTemplate>
                        <CheckBox Content="{Binding Header,UpdateSourceTrigger=PropertyChanged}" 
                                  IsChecked="{Binding Path=Visibility,Mode=TwoWay,
                            UpdateSourceTrigger=PropertyChanged,Converter={StaticResource DataGridColumnVisibilityConvert}}"/>
                    </DataTemplate>
                </ContextMenu.ItemTemplate>
            </ContextMenu>

  (2). 自定义显示隐藏的制转换器;

public class DataGridColumnVisibility : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool flag = false;
            Visibility vis = (Visibility)value;
            switch (vis)
            {
                case Visibility.Hidden:
                    flag = false;
                    break;
                case Visibility.Visible:
                    flag = true;
                    break;
                default:
                    break;
            }
            return flag;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool flag = System.Convert.ToBoolean(value);
            if (flag)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Hidden;
            }
        }
    }

2. 在实现DataGridColumn Filter 功能时,可以采用在DataGrid的外部(列头上)绑定对应的TextBox控件,并设置其样式与DataGridColumn基本一致,绑定宽度的方式来实现;

  (1). 绑定TextBox;

<TextBox  x:Name="txt2" Style="{StaticResource textBoxStyle}" Grid.Column="1"  VerticalAlignment="Top"  
                                     Foreground="Indigo" TabIndex="0" BorderThickness="1" Text="{Binding Data_idFilter_text, UpdateSourceTrigger=PropertyChanged}"
                                     HorizontalAlignment="Left" Visibility="{Binding Visibility,ElementName=studyID}">
                                <TextBox.Width>
                                    <MultiBinding Converter="{StaticResource VisibilityToWidthConverter}">
                                        <Binding Path="Visibility" ElementName="studyID"></Binding>
                                        <Binding Path="ActualWidth" ElementName="studyID"></Binding>
                                    </MultiBinding>
                                </TextBox.Width>
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="TextChanged">
                                        <i:InvokeCommandAction Command="{Binding LoadDataCommand}"/>
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
</TextBox>

  (2). 自定义多值转换器;

    class VisibilityToWidthConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            Visibility vis = (Visibility)values[0];
            double result = double.MinValue;
            switch(vis)
            {
                case Visibility.Hidden:
                    result = 0;
                    break;
                case Visibility.Visible:
                    result = (double)values[1];
                    break;
                default:
                    result = 0;
                    break;
            }
            return result;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }