2009-07-21 12 views
5

Bir GridViewColumn için CellTemplate kullanıyorum bir DataTemplate var.WPF, bağlama yoluna bir bağ eklememe izin vermeyecek - başka bir yol var mı?

Ben DataTemplate için böyle bir şey yazmak istiyorum:

<DataTemplate 
    x:Key="_myTemplate"> 
    <TextBlock 
     Text="{Binding Path={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}, Path=Header}}" /> 
</DataTemplate> 

Benim GridView bir DataTable bağlıdır, ve ben adını DataTable ait kolona bağlamak istediğiniz bir Üstbilgi eşittir GridViewColumn, DataTemplate ekinde bulunur. [Umarım bu mantıklıdır!]

Ne yazık ki, bu işe yaramıyor. Bir XamlParseException alıyorum: "Bağlama", "Bağlama" türünde 'Yol' özelliğinde ayarlanamaz. 'Bağlama', yalnızca bir DependenceyObject Bağımlılığı Özelliği'nde ayarlanabilir. "

Bunu nasıl kurabilirim?

Düzenleme

Temelde ihtiyaç (sorusuna Danm tarafından yorumunu yükseltici) olan bağlama hangi sütunun DataTemplate takılır DataContext tarafından belirlenen bir DataTemplate. Alternatif var mı?

+0

Niçin bu konuyu silverlight olarak etiketlediğinden emin değil misiniz? RelativeSource gümüş ışığı desteklenmiyor – AnthonyWJones

+0

Bunun için üzgünüm, Anthony. Silverlight'ın RelativeSource'u desteklemediğinin farkında değildim. Yine de RelativeSource kullanarak evlenmedim, bu yüzden benim soruma cevap vermeyen bir XAML çözümü varsa, bunu duymakla ilgilenirim. – devuxer

cevap

0

Herhangi bir özellik için Bağlama atayamazsınız. Özellik, Binding türünden biri veya nesnede Bağımlılık özelliği olarak uygulanmalıdır.

Binding sınıfının Path özelliği, PropertyPath türünde ve Binding, Path özelliğini bağımlılık özelliği olarak uygulamıyor. Bu nedenle Yolu, çalıştığınız şekilde dinamik olarak bağlayamazsınız.

Temelde DataTemplate yapılandırmasını sürücüleri, ciltlenmiş verilerin meta verileri yerleştirmek istediğiniz

Düzenleme. Bu sadece XAML'de yapılamaz. En azından koddan bazı desteğe ihtiyacınız olacaktır.

En iyi yaklaşımın bir ViewModel kullanmak olması bana öyle geliyor. Bu, XAML'deki bağlamayı düz-ileriye doğru iter ve bunu “ne ile ne bağlayacak” kararını ViewModel'in koduna doğru iter.

+0

Teşekkürler, ama sorum, XAML kullanarak amacımı gerçekleştirmenin başka bir yolu olup olmadığı. Temelde DataTemplate'in bağlı olduğu DataContext * ve * tarafından bağlanan bir DataTemplate'e ihtiyacım var. Alternatif var mı? Düzenlemeniz için – devuxer

+0

@Anthony, Thx. Benim sorum, aslında veritabanı çalışma zamanı olarak sorgulanana kadar sütun sayısı ve ilişkili bağlama yollarının bilinmediği bir GridView'de pivot verilerinin nasıl gösterileceği üzerine bir tartışma çıktı. MVVM kullanıyorum ve bir ViewModel kullanıyorum, ancak ilk çözümüm, XamlReader.Load() kullanarak codebehind içinde dinamik olarak DataTemplates oluşturmaktı. Bu, "iyi değil" olarak eleştirildi (bkz. Http: // stackoverflow.com/questions/1156336/yapılandırılabilir-a-gridview-to-show-pivoted-data-using-static-xaml-if), bu yüzden daha esnek bir DataTemplate denemem. – devuxer

+1

@Anothony (devam), DataContext'im ViewModel'im olarak ayarlandı ve GridView'ın ItemsSource'ım ViewModel'in (DataTable) bir özelliğine ayarlandı, ama sanırım ViewModel'in nasıl sorunu çözebileceğini anlamıyorum. GridViewColumn öğelerini dinamik olarak yüklenen XAML'ye başvurmadan doğru DataTable sütununa eşlemek. – devuxer

0

Sadece bunu istemiyor musunuz?

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}} 
+0

Burada sahip olduğunuz şeyin, her bir hücrenin metin kutusunu, Başlık ile aynı olması için sütun içinde ayarlayacağına inanıyorum. Benim istediğim, GridViewColumn'u DataTable'ın uygun DataColumn'una bağlamaktır, burada DataTable'daki sütunların isimleri GridViewColumns'un Header değeriyle eşleşir. Dolayısıyla, bir GridViewColumn için Header "Column3" ise, bu sütun DataTable'da "Column3" adlı sütuna bağlanır. Umarım bu mantıklıdır :) – devuxer

+0

GridViews satır tabanlı olduğundan, yani bir hücre bir çocuk veya bir satır değil, bir sütun olduğu için bunu yapmaya çalıştığınız şekilde sorun yaşayacağınızı düşünüyorum. WPF'nin bu dizi yayınına bakmayı deneyin, bazı karışıklıkların giderilmesine yardımcı olabilir: http://drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx. WPF'nin temel bir kuralı, eğer bir şey için tasarlanmamış bir şekilde kullanmaya çalışacak olursanız inanılmaz derecede zorlaşacaktır, ancak genellikle bunu zaten yapmak için kolay bir yolu vardır. Bu zor kısmı olan kolay bir yol bulmak ... –

+0

@Bryan Bir göz atacağım, teşekkürler! – devuxer