如何在xaml中动态更改数据网格列
本文关键字:数据 数据网 网格 动态 xaml | 更新日期: 2023-09-27 18:09:49
使用WPF DataGrid,我希望能够根据ViewModel上的属性更改xaml中显示的列。
这个想法只是基于ViewModel上的一个属性来改变列的集合。各种视图的列以不同的组合和顺序排列。
我认为这应该是微不足道的,但我找不到这样做的例子
任何帮助都会很感激。谢谢。
最简单的:
Xaml
<Window
x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Width="700">
<Window.Resources>
</Window.Resources>
<Grid>
<DataGrid
x:Name="grid"
ItemsSource="{Binding Persons}"
AutoGenerateColumns="False">
<!-- If Mode = City then
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="City" Binding="{Binding FavouriteCity}"/>
</DataGrid.Columns>
-->
<!-- If Mode = Colour then -->
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Colour" Binding="{Binding FavouriteColour}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
namespace Sample {
public partial class MainWindow: INotifyPropertyChanged
{
public ObservableCollection<Person> Persons { get; set; }
public string Mode { get; set; }
public MainWindow() {
InitializeComponent();
Persons = new ObservableCollection<Person>()
{ new Person("John","Yellow","Paris"),
new Person("Anne","Green","Lagos"),
new Person("James","Pink","Brussels")
};
Mode = "City";
OnPropertyChanged("Persons");
OnPropertyChanged("Mode");
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public class Person
{
public string Name { get; set; }
public string FavouriteColour { get; set; }
public string FavouriteCity { get; set; }
public Person(string name, string favouriteColour, string favouriteCity)
{
Name = name;
FavouriteColour = favouriteColour;
FavouriteCity = favouriteCity;
} } }
我相信有很多方法可以做到这一点,但我首先想到的是VisualStateManager。在这里查看MSDN。你可以从阅读该页底部的注释开始——节选:
VisualStateManager允许您指定控件的状态,当控件处于某种状态时的外观,以及当控件改变状态时的外观。
这里需要注意的是,我还没有真正使用过VSM;我只是在回答别人的问题时偶然发现的。你可能会发现他的问题是一个有指导意义的例子:使用VSM触发器改变GridView项目高度
这个类的用途的描述符合你的用例,你的实现看起来像一个相对简单的VSM示例的扩展。