2016-04-01 17 views
4

Dictionary<string, List<string>> benim WPF veri kılavuzuma doğru düzen ile bağlanırken sorun yaşıyorum. WPF MVVM Bind Sözlük <String, Liste <String>> datagrid'e göre

Bu

benim veri nesnesidir:

public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     var partners = new Dictionary<string, List<string>> 
     { 
      {"Company", new List<string> {"company1", "company2"}}, 
      {"Operator", new List<string> {"false", "true"}}, 
      {"Interest", new List<string> {"40%", "60%"}}, 
      {"Type", new List<string> {"type1", "type2"}} 
     }; 
     Asset = new Result("TestType", "TestName", partners); 
    } 

    public Result Asset { get; set; } 
} 

ben Partners sözlüğü bağlamak çalışıyorum: Ben kukla verilerle doldurulur ve benim ViewModel bir kamu malı olarak gözler önüne serdi

public class Result 
{ 
    public Result(string type, string name, Dictionary<string, List<string>> partners) 
    { 
     Type = type; 
     Name = name; 
     Partners = partners; 
    } 

    public string Type { get; set; } 
    public string Name { get; set; } 
    public Dictionary<string, List<string>> Partners { get; set; } 
} 

benim datagrid'im. Her sözlük girişinin (örneğin Şirket/Operatör/İlgi Alanı/Tür) Key, veri kılavuzumun başlıklarını, sütunları dolduran ilgili değerler ile oluşturmalıdır. Bunun gibi:

Company | Operator | Interest | Type 
company1 false  40%  type1 
company2 true  60%  type2 

Bunu nasıl başarabilirim? this question'a bakıyorum ama veri nasıl istediğimden başka bir şey değil. Anahtarlarım datagrid sütun başlıkları olarak istiyorum (başlık özelliklerinin veri bağlamayı kullanamayacağına inanıyorum). Bu ItemSource doğru bağlıdır, ancak ihtiyacım formatta veri almak için nasıl bilmiyorum, şimdiye kadar benim XAML: Ben ilk sütun için Binding="{Binding Value[0]} kullanırsanız

<DataGrid x:Name="dg" ItemsSource="{Binding Asset.Partners}" AutoGenerateColumns="false"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Company" Binding="{Binding ?}"/> 
     <DataGridTextColumn Header="Operator" Binding="{Binding ?}"/> 
     <DataGridTextColumn Header="Interest" Binding="{Binding ?}"/> 
     <DataGridTextColumn Header="Type" Binding="{Binding ?}"/> 
    </DataGrid.Columns> 
</DataGrid> 

, o zaman olsun, bir " sütunumdaki değerler satırını, ancak diğer şekilde yuvarlak olmasını istiyorum. Ayrıca Binding="{Binding Asset.Partners[Company]}" kullanmayı denedim ama bu işe yaramadı.

Herhangi bir yardım için teşekkür ederiz.

+1

Sözlükleri bağlamalarda kullanmayın. Birkaç farklı nedenden ötürü emerler. Anahtar/değer çiftlerinizi tutmak ve onları bir Gözlemlenebilir Koleksiyon haline getirmek için belirli bir tür oluşturun. Eğer nerdly bir programcı iseniz, bir sözlük yararları sağlayan ama büyük emmeksizin INOTifyCollectionChanged uygulayan KeyedCollection bir uygulama yaratabilirsiniz. \ – Will

+0

@Will - onlar bana "emmek" söylemek özellikle yararlı değildir nedenini söylemeden. – Courlu

+0

En az biriyle karşılaştığınız birkaç nedenden dolayı emiyorlar. Diğerleri, DataTemplates'in gücünü, değişiklik bildirimini vb. Karıştırmayı içerir. Öğrendikleriniz gibi, emerler. Açıkçası, daha önemli olan anahtarlı koleksiyon hakkında benim tavsiyem. Git ona bak, ve zamanlarını sözlüklerle boşa harcama. – Will

cevap

3

Kişisel olarak verilerinizi temsil eden bir nesne modeli oluşturabilir ve bu nesnelerin bir koleksiyonuna bağlanır.

public class MyObject 
{ 
    public string Company { get; set; } 
    public string Operator { get; set; } 
    public string Interest { get; set; } 
    public string Type { get; set; } 
} 

ve

public MainViewModel() 
{ 
    var partners = new ObservableCollection<MyObject>() 
    { 
     new MyObject("company1", "false", "40%", "type1"), 
     new MyObject("company2", "true", "60%", "type2") 
    }; 
    ... 
} 

Ben koleksiyonunda her satır için bir DataRow oluşturmak ve atamak" gibi şeyleri okur, çünkü normal bir DataGrid ile mümkündür soran şeyi düşünmüyorum Bu satıra DataContext ". Durumunuzda, her satır tüm veri şebekesini temsil eder, bu yüzden bu sizin için işe yaramaz.

+0

Yaptığım değerlendirmelerden dolayı Varlık türümün özellikleri için ek nesne modelleri oluşturmayı denemek ve denemek istedim. Sözlük formatlarında büyük miktarda veri döndüren bir hizmetim var. Bu yüzden bunları doğrudan bağlayabileceğimi umuyordum. Ek nesne modellerinden kaçınmak istediğimi farz edersem, verileri DataTable formatında servisten geri döndürmek daha iyi olur mu? Ya da sözlüğümü yeniden yapılandırıyor musunuz? – Courlu

+0

@Courlu Yeni bir nesne modeli, performansı etkilememeli ve kodunuzun okunmasını kolaylaştırmalıdır, ancak evet.Sözlüğünüzü yeniden yapılandırabilmeniz için sözlükteki her bir öğe, her satır için tüm verilerdir ('yeni Liste {" şirket1 "," yanlış ","% 40 "," type1 "}' ve "{Binding Value" ile bağlanır [0]}, ya da bir DataTable kullanın.Bir iki kişiden sadece yapısal veri sahibi olmanız ve XAML'yi kodlamak zorunda kalmamanız için bir veri tablosunu tercih ederim – Rachel

+0

Tamam, yardımınız için çok teşekkürler! Çok sayıda ek nesne oluştururken performace isabeti: Bellek ayırmak ve yapıcıyı çalıştırmak gibi? – Courlu