使用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;
} } }
答案 0 :(得分:0)
我确信有很多种方法,但我想到的第一件事就是VisualStateManager。请参阅MSDN here。您可以从阅读该页面底部的备注开始 - 摘录:
VisualStateManager允许您指定控件的状态,控件在某个状态时的外观以及控件何时更改状态。
这里需要注意的是,我还没有真正使用过VSM;我只是在回答另一个人的问题时遇到过它。你可能会发现他的问题是一个有启发性的例子:Changing GridView Item height using VSM Triggers
此类的用途描述与您的用例相匹配,并且您的实现似乎是VSM示例的相对简单的扩展。