Tôi sẽ mở đầu này bằng cách nói rằng nó có thể không phải là giải pháp tốt nhất để được làm và không thể làm việc trong một số tình huống, nhưng bạn có thể cung cấp cho nó một thử và xem nếu nó sẽ làm việc cho bạn muốn gì. Tôi chỉ đánh nó lên để nó có thể có một số lỗi trong đó. Nó vẫn sẽ liên quan đến một số mã, nhưng nó giữ mô hình của bạn không biết về bạn xem.
Những gì bạn cần làm là tạo thuộc tính tiện ích mở rộng cho phép bạn liên kết thuộc tính Cột trên DataGrid. Đây là một ví dụ mà tôi đặt lại với nhau.
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;
public static class DataGridExtension
{
public static ObservableCollection<DataGridColumn> GetColumns(DependencyObject obj)
{
return (ObservableCollection<DataGridColumn>)obj.GetValue(ColumnsProperty);
}
public static void SetColumns(DependencyObject obj, ObservableCollection<DataGridColumn> value)
{
obj.SetValue(ColumnsProperty, value);
}
public static readonly DependencyProperty ColumnsProperty =
DependencyProperty.RegisterAttached("Columns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridExtension),
new UIPropertyMetadata (new ObservableCollection<DataGridColumn>(),
OnDataGridColumnsPropertyChanged));
private static void OnDataGridColumnsPropertyChanged(
DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (d.GetType() == typeof(DataGrid))
{
DataGrid myGrid = d as DataGrid;
ObservableCollection<DataGridColumn> Columns =
(ObservableCollection<DataGridColumn>)e.NewValue;
if(Columns != null)
{
myGrid.Columns.Clear();
if (Columns != null && Columns.Count > 0)
{
foreach (DataGridColumn dataGridColumn in Columns)
{
myGrid.Columns.Add(dataGridColumn);
}
}
Columns.CollectionChanged += delegate(object sender,
NotifyCollectionChangedEventArgs args)
{
if(args.NewItems != null)
{
foreach (DataGridColumn column
in args.NewItems.Cast<DataGridColumn>())
{
myGrid.Columns.Add(column);
}
}
if(args.OldItems != null)
{
foreach (DataGridColumn column
in args.OldItems.Cast<DataGridColumn>())
{
myGrid.Columns.Remove(column);
}
}
};
}
}
}
}
Sau đó, bạn gắn nó vào bạn DataGrid như thế này (Nơi cột là tài sản một ObservableCollection trên mô hình quan điểm của bạn)
<Controls:DataGrid AutoGenerateColumns="False"
DataGridExtension.Columns="{Binding Columns}" />
Tôi không chắc chắn như thế nào nó sẽ trả lời nếu bạn bắt đầu thêm và xóa các cột, nhưng dường như nó hoạt động từ thử nghiệm cơ bản của tôi. Chúc may mắn!
Nguồn
2010-06-24 19:44:20
Mã trên sẽ thực hiện công việc trong trường hợp chung. Tuy nhiên, nó sẽ thất bại khi bạn ẩn DataGrid và làm cho nó hiển thị một lần nữa. Bởi vì các thuộc tính cột sẽ hiển thị rằng có 0 cột khi chúng được ẩn và khi thuộc tính cột được thay đổi, cuộc gọi lại sẽ được kích hoạt và nó sẽ cố gắng thêm cột một lần nữa, nhưng cột vật lý không tồn tại trong datagrid để mã sẽ thất bại với một ngoại lệ nói rằng không thể thêm các cột trùng lặp. –