2010-01-25 8 views
5

Özel nesneler listem var: İki dize özelliğine sahip meyve Ad ve Renk. Bunlar bir Listede. Daha sonra listeye meyve nesneleri yüklüyorum.WPF Liste sorunları için Datagrid bağlaması

Ben WPF veri için bu listeyi bağlamak çalışıyorum:

C#:

dgFruit.ItemsSource = "{Binding}"; 

XAML: Ben kullanıcı olmak istiyorum, çünkü onlar bir combobox olan

<toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding Path=fruitList}" > 
       <toolkit:DataGrid.Columns> 

        <toolkit:DataGridComboBoxColumn 
      Header="Name" 
      SelectedValueBinding="{Binding Path=Name}" 
      TextBinding="{Binding Path=Name}" Width="5*" /> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      SelectedValueBinding="{Binding Path=Color}" 
      TextBinding="{Binding Path=Color}" Width="5*" /> 

       </toolkit:DataGrid.Columns> 
      </toolkit:DataGrid> 

Nedeni ise ilişkiyi değiştirebilir. Bu gerçek bir örnek değil ama sizde fikir edinirsiniz. Örneklerin uğruna, meyvenin olgun olmadıklarını söyleyin, bu yüzden Banana rengini yeşile dönüştürürler :)

Bu öğeleri datagrid'de aldığımda hiç şansım yok ... ve aşağı inmek istiyorum.

System.Windows.Data Error: 39 : BindingExpression path error: 'Color' property not found on 'object' ''Char' (HashCode=6750311)'. BindingExpression:Path=Color; DataItem='Char' (HashCode=6750311); target element is 'TextBlockComboBox' (Name=''); target property is 'Text' (type 'String') 

Can: combobox değiştirmek ve Meyve İsimleri ve Renkler olası tüm türleri göstermek için datagridcell nesneye tıklayın İşte

i alıyorum bir hatadır (böylece ilişkileri değiştirebilir) kimse yardım eder? Kolonlarımı xaml olarak ayarlamamın nedeni, genişliğin yıldız boyutuna ayarlanabilmesi ve sütunların eşit genişliğe sahip olmasıdır.

Çoğu örnekte bir ObservableCollection kullandığımı görüyorum, ancak listeye bağlanabiliyorsam neden bunu kullanmak zorundayım? Benim örnek fazla açıklama

Edit gerektiriyorsa

beni knwo izin verin: ne var şimdi:

XAML:

  <toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 

       <toolkit:DataGrid.Columns> 
        <toolkit:DataGridTextColumn 
         Header="Name" 
         Width="5*"/> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      Width="5*"/> 

        </toolkit:DataGrid.Columns> 
</toolkit:DataGrid> 

C#: Aslında

DataContext = fruitList; 

DataContext kullandığımda hiçbir ite MS. ItemSource'ı kullandığımda boş satırlar aldım, ancak doğru satır sayısı bende bu doğru satırlarda daha fazla görünüyor.

Verileri otomatik olarak sütun oluşturmama izin verip vermeyebilirim. Eğer autogeneratecolumns'i false olarak ayarladıysam ve sonra da xaml'de yıldız boyutlandırma kullanmak istediğim gibi sütunlarımı belirtirsem, doğru sayıda sütun alırım ancak metin yok!

cevap

4

İlk için INotifyCollectionChanged ve INotifyPropertyChanged uygular olduğunu. Bu neredeyse kesinlikle istediğiniz gibi değildir (aslında, eğer bunu yaparsanız, dizideki her karakter için bir tane olmak üzere dokuz satırlı bir kılavuzla bitirmelisiniz!). ItemsSource öğesini XAML'de veya arkasındaki kodda ayarlayabilirsiniz, ancak her ikisini de yapmamalısınız. Aşağıdakileri deneyin: Görsel kurucusunda

<toolkit:DataGrid Name="dgFruit"  
        ItemsSource="{Binding}"> 
    ... 
</toolkit:DataGrid> 

Ve sonra:

... 
    InitializeComponents(); 
    this.DataContext = fruitList; 
... 

Şimdi veri bağlamı senin görsel bütün Liste <Meyve>, ve ızgara ItemsSource olmak için ayarlanır edilir aynı nesne. Ben burada fruitList'in görselin bir alanı olduğunu farz ediyorum. AllColors (bu durumda) bir kaynak olarak tanımlanır

 <toolkit:DataGridTextColumn Header="Name" 
            Binding="{Binding Name}" 
            Width="5*" /> 
     <toolkit:DataGridComboBoxColumn Header="Color" 
             ItemsSource="{Binding Source={StaticResource AllColors}}" 
             SelectedValueBinding="{Binding Path=Color}" 
             TextBinding="{Binding Path=Color}" 
             Width="5*" /> 

:

<x:Array x:Key="AllColors" 
     Type="sys:String"> 
    <sys:String>Orange</sys:String> 
    <sys:String>Yellow</sys:String> 
</x:Array> 

Bu sizin başlamış Sütunlarınızın

bağlamaları gibi görünmelidir.

+0

o owrks ama bunu yaptığımda xaml olarak tanımladığım sütunlar göz ardı ediliyor ve soldakilere yeni ekler ekliyor. Bu otomatik oluşturulan sütunlar için yıldız boyutlarını programlayabilir miyim? – baron

+0

Otomatik oluşturulanları kapatabilirsiniz. ! XAML sizin DataGrid üzerinde: - gibi çalıştı – lesscode

+0

yaklaşıyor AutoGenerateColumns = "Yanlış", artık hiçbir öğe olsa :(Geçen gün bunu deneyin vermedi biliyorum ben yok Düzenlenen yanıt – baron

4

WPF, alanlara bağlamayı desteklemiyor. fruitList'a erişen ve buna bağlanan bir özellik oluşturun.

// this is the field. you can't bind to this 
    private readonly List<Fruit> fruitList = new List<Fruit>(); 

    // this is the property. you can bind to this 
    public List<Fruit> FruitList 
    { 
     get { return fruitList; } 
    } 

Kullanım dgFruit.DataContext = this; yerine dgFruit.ItemsSource = "{Binding}";

ait Ve eğer bir ComboBox bu göstermek istiyorsanız, renklerin bir listesini değil, sadece bir dizeye bu DataGridComboBoxColumn bağlamak gerekir.Örneğin, sınıf

public class Fruit 
{ 
    public string Name { get; set; } 
    public string Color { get; set; } // bind the combobox selectedvalue to this 

    public List<string> AvailableColors { get; set; } // bind the combobox ItemsSource to this 
} 

gibi görünebilir Ve isterseniz bir List kullanabilirsiniz.

dgFruit.ItemsSource = "{Binding}" 

ayraç Bağlama sözcüğünü içeren bir dizeye ürün kaynağını ayarlamalısınız: ObservableCollection avantajı bu, zaten sen

+0

Meyve listesine erişen bir özellik oluşturarak ne demek istediğini anlamıyorum. Listelerimi her yerde kullanabilmem için ObservableCollection'ı kullanabilirim. Ve bunun bir liste olması gerektiğine inanıyorum. Bu listenin Fruit.Color veya Fruit.Name'deki tüm değerler olmasını istiyorum. Kılavuz görünümü shuold orijinal ilişkiyi gösterir, yani Apple -> Kırmızı ve Muz -> Sarı değerlerdir, ancak Apple'ı çift tıklarsam, tüm meyve nesnelerine, Apple ve Banana'ya ve benzer şekilde Renk seçeneğine sahiptir. – baron