SORU
26 Kasım 2008, ÇARŞAMBA


Ne kadar değişken bir sütun sayısı için bir WPF Kılavuzunu bağlamak mı?

WPF başvurum sütun farklı bir sayı her zaman var olan veri setleri oluşturur. Çıkış dahildir biçimlendirme uygulamak için kullanılacak olan her sütun için bir açıklama. Çıkış basitleştirilmiş bir versiyonu gibi bir şey olabilir:

class Data
{
    IList<ColumnDescription> ColumnDescriptions { get; set; }
    string[][] Rows { get; set; }
}

Bu sınıf WPF üzerinde veri Kılavuzunu DataContext olarak ayarlanır ama aslında sütunları Program aracılığıyla oluşturmak:

for (int i = 0; i < data.ColumnDescriptions.Count; i  )
{
    dataGrid.Columns.Add(new DataGridTextColumn
    {
        Header = data.ColumnDescriptions[i].Name,
        Binding = new Binding(string.Format("[{0}]", i))
    });
}

XAML dosyasında veri bağlamaları ile bu kodu değiştirmek için herhangi bir şekilde yerine var mı?

CEVAP
7 Aralık 2010, Salı


İşte Kılavuzunu Bağlama Sütunları için geçici bir çözüm. Columns özelliği salt Okunur, herkes fark eder gibi olduğu için, toplama CollectionChanged olay üzerinden değişiklikler Kılavuzunu Sütunlar güncellemeleri her hangi bir Bağlı Özellik BindableColumns denen yaptım.

Eğer varsa DataGridColumn Bu Koleksiyon

public ObservableCollection<DataGridColumn> ColumnCollection
{
    get;
    private set;
}

O zaman bu gibi ColumnCollection için BindableColumns bind edebiliriz

<DataGrid Name="dataGrid"
          local:DataGridColumnsBehavior.BindableColumns="{Binding ColumnCollection}"
          AutoGenerateColumns="False"
          ...>

Bağlı Özelliği BindableColumns

public class DataGridColumnsBehavior
{
    public static readonly DependencyProperty BindableColumnsProperty =
        DependencyProperty.RegisterAttached("BindableColumns",
                                            typeof(ObservableCollection<DataGridColumn>),
                                            typeof(DataGridColumnsBehavior),
                                            new UIPropertyMetadata(null, BindableColumnsPropertyChanged));
    private static void BindableColumnsPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        DataGrid dataGrid = source as DataGrid;
        ObservableCollection<DataGridColumn> columns = e.NewValue as ObservableCollection<DataGridColumn>;
        dataGrid.Columns.Clear();
        if (columns == null)
        {
            return;
        }
        foreach (DataGridColumn column in columns)
        {
            dataGrid.Columns.Add(column);
        }
        columns.CollectionChanged  = (sender, e2) =>
        {
            NotifyCollectionChangedEventArgs ne = e2 as NotifyCollectionChangedEventArgs;
            if (ne.Action == NotifyCollectionChangedAction.Reset)
            {
                dataGrid.Columns.Clear();
                foreach (DataGridColumn column in ne.NewItems)
                {
                    dataGrid.Columns.Add(column);
                }
            }
            else if (ne.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (DataGridColumn column in ne.NewItems)
                {
                    dataGrid.Columns.Add(column);
                }
            }
            else if (ne.Action == NotifyCollectionChangedAction.Move)
            {
                dataGrid.Columns.Move(ne.OldStartingIndex, ne.NewStartingIndex);
            }
            else if (ne.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (DataGridColumn column in ne.OldItems)
                {
                    dataGrid.Columns.Remove(column);
                }
            }
            else if (ne.Action == NotifyCollectionChangedAction.Replace)
            {
                dataGrid.Columns[ne.NewStartingIndex] = ne.NewItems[0] as DataGridColumn;
            }
        };
    }
    public static void SetBindableColumns(DependencyObject element, ObservableCollection<DataGridColumn> value)
    {
        element.SetValue(BindableColumnsProperty, value);
    }
    public static ObservableCollection<DataGridColumn> GetBindableColumns(DependencyObject element)
    {
        return (ObservableCollection<DataGridColumn>)element.GetValue(BindableColumnsProperty);
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LivestrongWoman

    LivestrongWo

    1 Aralık 2011
  • sknbp

    sknbp

    16 Kasım 2006
  • The Computer Chronicles

    The Computer

    7 Kasım 2012