【6月日新计划37】WPF使用Prism動態調整DataGrid的欄位顯示

273 阅读2分钟

1. Config DataGridTextColumn Visibility

思路:給DataGridTextColumn的Visibility屬性動態賦值,通過mvvm前後交互

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Border BorderBrush="Aqua"
                BorderThickness="4"
                CornerRadius="10"
                Margin="10">
            <DataGrid x:Name="NewPallet"
                      Margin="10"
                      AutoGenerateColumns="False"
                      FontSize="14"
                      ItemsSource="{Binding StuList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      RowHeight="35">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Loaded">
                        <prism:InvokeCommandAction Command="{Binding FocusPalletCommand}"
                                                   TriggerParameterPath="Source" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding StuId}"
                                        Header="Stu Id" />
                    <DataGridTextColumn Binding="{Binding StuName}"
                                        Header="Stu Name" />
                    <DataGridTextColumn Binding="{Binding Age}"
                                        Visibility="{Binding ColumnVisibility}"
                                        Header="Age" />
                    <DataGridTextColumn Binding="{Binding ColumnVisibility}"
                                        Header="Visibility" />
                </DataGrid.Columns>
            </DataGrid>
        </Border>
        <StackPanel Grid.Row="1"
                    Margin="10"
                    Orientation="Vertical"
                    Visibility="{Binding ColumnVisibility}"
                    HorizontalAlignment="Center">
            <TextBox Style="{StaticResource MaterialDesignOutlinedTextBox}"
                     Width="500"
                     FontSize="20"
                     FontWeight="Bold"
                     Height="55"/>
        </StackPanel>
        <StackPanel Grid.Row="2"
                    Margin="10"
                    Orientation="Vertical"
                    HorizontalAlignment="Center">
            <Button Content="Change Visibility"
                    Width="150"
                    Height="45"
                    Command="{Binding ButtonCommand}"
                    CommandParameter="ChangeStatus"/>
        </StackPanel>

    </Grid>
  • 第一步:通過點擊按鈕,調整ColumnVisibility的值(Visible or Collapsed),發現我的輸入框是可以隱藏的,但是DataGrid的Age欄位沒有變化。

  • 第二步:於是我把ColumnVisibility作為Student的屬性,放到StuList裡面,然後點擊按鈕。通過foreach修改每一個對象的屬性,發現Visibility這一欄的值來回切換(Visible or Collapsed),可是Age欄還是沒有隱藏

  • 反復找答案,都是這個方法,就是不成功,非常Nice,

111.jpg

2. Cache

1.創建Cache

juejin.cn/post/727788…

2.使用behaviors將控件傳給後端

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"


    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Border BorderBrush="Aqua"
                BorderThickness="4"
                CornerRadius="10"
                Margin="10">
            <DataGrid x:Name="NewPallet"
                      Margin="10"
                      AutoGenerateColumns="False"
                      FontSize="14"
                      ItemsSource="{Binding StuList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      RowHeight="35">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Loaded">
                        <prism:InvokeCommandAction Command="{Binding CacheCommand}"
                                                   TriggerParameterPath="Source" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding StuId}"
                                        Header="Stu Id" />
                    <DataGridTextColumn Binding="{Binding StuName}"
                                        Header="Stu Name" />
                    <DataGridTextColumn Binding="{Binding Age}"
                                        Header="Age" />
                    <DataGridTextColumn Binding="{Binding ResultVisibility}"
                                        Header="Visibility" />
                </DataGrid.Columns>
            </DataGrid>
        </Border>

        <StackPanel Grid.Row="2"
                    Margin="10"
                    Orientation="Vertical"
                    HorizontalAlignment="Center">
            <Button Content="Change Visibility"
                    Width="150"
                    Height="45"
                    Command="{Binding ButtonCommand}"
                    CommandParameter="ChangeStatus"/>
        </StackPanel>

    </Grid>

3.遍歷Columns。通過header找到對應欄位,設定Visibility屬性

        #region Event
        public DelegateCommand<string> ButtonCommand { get; private set; }

        public DelegateCommand<object> CacheCommand { get; private set; }
        #endregion

        public DataGridViewModel(PackingCache packingCache)
        {
            _cache = packingCache;
            StuList = new ObservableCollection<StudentDemo>();
            ButtonCommand = new DelegateCommand<string>(ButtonExecute);
            CacheCommand = new DelegateCommand<object>(CacheFunction);

            InitialLoad();
        }

        public void CacheFunction(object obj)
        {
            if (obj != null)
            {
                DataGrid myDataGrid = obj as DataGrid;
                ObservableCollection<DataGridColumn> columns = myDataGrid.Columns;
                _cache.Set("dataGrid", columns);
            }
        }

        public void ButtonExecute(string obj)
        {
            switch (obj)
            {

                case "ChangeStatus":
                    ChangeDataGrid();
                    break;
                case "x":
                    break;
            }
        }

        public void ChangeDataGrid()
        {
            switch (ResultVisibility)
            {

                case "Collapsed":
                    ResultVisibility = Visibility.Visible.ToString();
                    System.Diagnostics.Trace.WriteLine(ResultVisibility);
                    break;
                case "Visible":
                    ResultVisibility = Visibility.Collapsed.ToString();
                    System.Diagnostics.Trace.WriteLine(ResultVisibility);
                    break;
            }

            ObservableCollection<DataGridColumn> columns = (ObservableCollection<DataGridColumn>)_cache.GetOrDefault("dataGrid");
            foreach (DataGridColumn column in columns)
            {
                var name = (string)column.Header;
                switch (ResultVisibility)
                {
                    case "Collapsed":
                        if ("Visibility".Equals(name))
                            column.Visibility = Visibility.Collapsed;
                        break;
                    case "Visible":
                        if ("Visibility".Equals(name))
                            column.Visibility = Visibility.Visible;
                        break;

                }
            }
        }