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,
2. Cache
1.創建Cache
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;
}
}
}