2012-02-26 9 views
9

Bu soru için arka plan/koşul: Bir WPF masaüstü uygulamasına sahibim. SQL veritabanına bağlanmak için LINQ to SQL'i kullanır ve verilerini WPF Datagrids'te gösterir. Oldukça iyi çalışıyordu, fakat performans bir problemdi çünkü LINQ ölümcül yavaş olabilir, bu yüzden mantığı ve UI denetimlerini LINQ veritabanı bağlamlarından olabildiğince uzağa geçiriyorum ve bunun yerine çok benzer olan yerel değişkenlere yüklüyorum. Performansı büyük ölçüde artıran LINQ nesneleri.WPF Datagrids uygulamasında "İki yönlü bağlanma Yolu veya XPath gerektirir" özel durumunu nasıl gideririm?

sorun: benim datagrids test ederken, şimdi yeni bir durum alıyorum "bağlama İki yönlü yolu veya XPath gerektirir ." Ben belli (tamsayı değeri düzenleyin çalıştığınızda dize sütunları düzenleme iyi olsa da, bir Datagrid sütunu. Bunu neden anladığımı veya bu konuda ne yapacağımı anlamıyorum.

Bu nedenle, datagrid.datacontext bir LINQ varlık ilişkilendirmesine ayarlandığında çalıştı, ancak yalnızca düz nesnelerin listesine ayarlandığında hemen hemen çalışır. Listeyi bir ObservableCollection olarak değiştirmeyi denedim, ancak bunun belirgin bir etkisi yoktu.

Burada ve diğer sitelerde bir düzine farklı ilgili soruyu inceledim ve yardım eden bir şey görmüyorum.

Şu anda var:

<DataGrid Margin="12,110,12,0" x:Name="dgDays" ItemsSource="{Binding}" 
       Height="165" VerticalAlignment="Top" MinHeight="0" 
       AutoGenerateColumns="False" 
       SelectionChanged="dgDays_SelectionChanged"> 

... koduna göre bağlıdır

<DataGrid.Columns> 
      <DataGridComboBoxColumn Width="80" Header="Cook" x:Name="_DailyCookCombo" SelectedItemBinding="{Binding sCook}"/> 
      <DataGridComboBoxColumn Width="80" Header="Eat" x:Name="_DailyDayCombo" SelectedItemBinding="{Binding sDay}"/> 
      <DataGridTextColumn Width="52" Header="Prot" Binding="{Binding Protein}" /> 
      <DataGridTextColumn Width="52" Header="Carb" Binding="{Binding Carb}" /> 
      <DataGridTextColumn Width="52" Header="Fat" Binding="{Binding Fat}" /> 
      <DataGridTextColumn Width="62" Header="Prot %" Binding="{Binding ProteinPercent}" /> 
      <DataGridTextColumn Width="62" Header="Carb %" Binding="{Binding CarbPercent}" /> 
      <DataGridTextColumn Width="62" Header="Fat %" Binding="{Binding FatPercent}" /> 
      <DataGridTextColumn Width="116" Header="non PFW meals" Binding="{Binding NonPFWMeals}" /> 
      <DataGridTextColumn Width="55" Header="Prot" Binding="{Binding CalcProt}" IsReadOnly="True" /> 
      <DataGridTextColumn Width="55" Header="Carb" Binding="{Binding CalcCarbs}" IsReadOnly="True" /> 
      <DataGridTextColumn Width="55" Header="Fat" Binding="{Binding CalcFat}" IsReadOnly="True" /> 
      <DataGridTextColumn Width="65" Header="KCal" Binding="{Binding CalcKCal}" IsReadOnly="True" /> 
      <DataGridCheckBoxColumn Width="32" Header="Skip" Binding="{Binding Skip}" /> 
      <DataGridTextColumn Width="70" Header="Date" Binding="{Binding sNextDate}" IsReadOnly="True" /> 
     </DataGrid.Columns> 
    </DataGrid> 

:

dgDays.DataContext = TheMember.RAM_Member_Requirements_Days; 

tanımlanan olarak:

public ObservableCollection<RAM_Member_Requirements_Day> RAM_Member_Requirements_Days = new ObservableCollection<RAM_Member_Requirements_Day>(); 
public class RAM_Member_Requirements_Day : INotifyPropertyChanged 
{ 
    // RAM equivalents of DB values: 
public System.Nullable<decimal> Protein; 
public System.Nullable<decimal> Carb; 
public System.Nullable<decimal> Fat; 
public System.Nullable<decimal> ProteinPercent; 
public System.Nullable<decimal> CarbPercent; 
public System.Nullable<decimal> FatPercent; 
public System.Nullable<int> NonPFWMeals; 
public System.Nullable<bool> Skip; 
public System.Nullable<System.DateTime> SkipDate; 

kısa bir süre sitenin 8 saatlik gecikmeden sonra beni bıraktığında ben göndeririz ki, bu yazdıktan sonra çok basit bir düzeltme bulundu: kimin bağlı üyeleridir

.

cevap

3

Tamam, iyi, her şeyi yazarak, çalışmış bir şey denedim. Ben başkalarına yardımcı olursa, ben zaten gönderiyorum.

çözüm bağlıdırlar sorun üyesi değişkenlere eklemek oldu:

{get; set; }

olarak: arıza Bağlama C# bir karşı XAML yolu adına küçük bir farkla neden olabilir

public System.Nullable<decimal> Protein { get; set; } 
    public System.Nullable<decimal> Carb { get; set; } 
    public System.Nullable<decimal> Fat { get; set; } 
    public System.Nullable<decimal> ProteinPercent { get; set; } 
    public System.Nullable<decimal> CarbPercent { get; set; } 
    public System.Nullable<decimal> FatPercent { get; set; } 
    public System.Nullable<int> NonPFWMeals { get; set; } 
    public System.Nullable<bool> Skip { get; set; } 
+2

Bunun sizin için gizemli olması durumunda, alanlara, yalnızca özelliklere bağlayamazsınız. Nedeniyle ilgili bir açıklama için bkz: http://stackoverflow.com/questions/842575/why-does-wpf-support-binding-to-properties-of-an-object-but-not-fields – MatrixManAtYrService

+0

@MatrixManAtYrService Teşekkürler, Bunu okuduktan sonra hala benim için gizemli. Görünüşe göre alanlar ve mülkler arasındaki tanımların ve farklılıkların okunması gerekiyor. – Dronz

+1

Heh. Tamam, biraz okuma yapıyorum, C# 'nin ne dediğini bilmeden alanları ve özellikleri kullandım. İlginç, teşekkürler. – Dronz

3

bir "bağlanma iki-yönlü yolu veya XPath gerektirir" öğesi. Baş harfleri gerçekten önemlidir! Bu benim sorunumdu.

XAML:

<DataGridTextColumn Binding="{Binding Path=TotalHeure}" ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/> 

C#:

public string Totalheure { get; set; } 

bu onlar tam olarak aynı olmasa ve programlar mümkün olmadığı için bir iki yönlü bir yolu veya XPath hatası gerektiren bağlayıcı neden olur bağlama yolunu bulmak!

Belki bi bağlı metin kutusu ile bu sorunu koştu Aynı hatayı

5

yapılan başkası yardımcı olacaktır. Benim çözümüm açık bir şekilde ".":

<TextBox Text="{Binding Path=.}" /> 

Bu hile yapıldı.