如何在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;
    }    }    }

如何在xaml中动态更改数据网格列

我相信有很多方法可以做到这一点,但我首先想到的是VisualStateManager。在这里查看MSDN。你可以从阅读该页底部的注释开始——节选:

VisualStateManager允许您指定控件的状态,当控件处于某种状态时的外观,以及当控件改变状态时的外观。

这里需要注意的是,我还没有真正使用过VSM;我只是在回答别人的问题时偶然发现的。你可能会发现他的问题是一个有指导意义的例子:使用VSM触发器改变GridView项目高度

这个类的用途的描述符合你的用例,你的实现看起来像一个相对简单的VSM示例的扩展。