如何在xaml中动态更改Datagrid列

时间:2015-08-25 14:49:09

标签: c# wpf templates binding datagrid

使用WPF DataGrid,我希望能够根据ViewModel上的属性更改xaml中显示的列。

Idea只是根据ViewModel上的属性更改Columns集。各种视图具有不同组合的列,并且具有不同的顺序。

我认为这应该是微不足道的,但是我无法找到在

之前完成此操作的示例

任何帮助将不胜感激。 感谢。

最简单:

的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;
    }    }    }

1 个答案:

答案 0 :(得分:0)

我确信有很多种方法,但我想到的第一件事就是VisualStateManager。请参阅MSDN here。您可以从阅读该页面底部的备注开始 - 摘录:

  

VisualStateManager允许您指定控件的状态,控件在某个状态时的外观以及控件何时更改状态。

这里需要注意的是,我还没有真正使用过VSM;我只是在回答另一个人的问题时遇到过它。你可能会发现他的问题是一个有启发性的例子:Changing GridView Item height using VSM Triggers

此类的用途描述与您的用例相匹配,并且您的实现似乎是VSM示例的相对简单的扩展。