2009-10-28 22 views
22

Şu anda bir WPF kullanıcı denetimi içinde çalışıyorum (XAML dosyamın kök öğesi "UserControl" dir), ki bir pencerenin içinde barındırıldığını biliyorum. Veri bağlama özelliğini kullanarak Pencerenin bir özelliğine nasıl erişebilirim? basitçe WPF Veri Bağlama'nın "RelativeSource FindAncestor" ile tam olarak ne yapar?

<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Window}}" Path="..." /> 

çalışmıyor

neden

bilen var mı? Aldığım hata iletisi:

System.Windows.Data Uyarı: 4: Referans ile bağlama için kaynak bulunamıyor 'RelativeSource FindAncestor, AncestorType =' System.Windows.Window ', AncestorLevel =' 1 ''.

Edit: ArsenMkrt'ın yaklaşımında bir varyasyon kullanarak sona erdim, bu yüzden cevabını kabul ettim. Bununla birlikte, hala FindAncestor'un neden sadece "işe yaramadığını" bulmakla ilgileniyorum.

+2

Cevabını değiştirdiğinizi söylediniz, aslında yaptığınız şeyi yayınlayabilir misiniz? – Miles

+0

MVVM modeli bağlamında bu soruna bir çözüm aradığımı unutmayın. Bağlamak istediğim Pencerenin özelliği, aslında Window ViewModel'in bir özelliğiydi. – user200783

+1

ArsenMkrt, UserControl'de bir özellik oluşturulmasını ve buna bağlanmayı önerdi, ardından da bu özelliği Window'un istenen özelliğine bağlayarak (XAML'de). Ancak MVVM modeli ile, UserControl XAML'de hiç görünmedi, bu yüzden ikinci kısım mümkün değildi. – user200783

cevap

15

iyi yolu ben düşünün bu

<UserControl x:Name = "myControl"> 
    <Label Content={Binding ElementName= myControl, Path=MyProperty}/> 
</UserControl> 
+0

Ancak, UserControl'de değil, içeren Pencerede (başka bir XAML dosyasında tanımlı) bir özelliği bağlamak istiyorum. – user200783

+0

UserControl içinde mülk sahibi olmak ve bu özelliği pencere özelliği ile bağlamak daha iyi olacaktır –

+2

UserControl'de bağımlılık özelliği oluşturabilir misiniz? pencereye usercontrol eklemiyor musunuz?

0

gibi UserControl bağlama yerine, UserControl

iki yönlü bağlama ile UserControl bağımlılık özelliği MyProperty oluşturun ve ana Pencerede bağlamak için bir ad vermektir bir ItemsControl veyagelen 'kaçış' çalışıyorsanız

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor ,AncestorType={x:Type Grid}},Path=BackGround , Mode=OneWayToSource , UpdateSourceTrigger = PropertyChanged}" /> 
4

: Bu gibi Mode = "OneWayToSource" SET Should Bir Window almak için 10, x:Type Window AncestorType çalışmadığını fark ediyor olabilirsiniz. Ya da en azından ...

Bu durumda, muhtemelen Blend veya Visual Studio'yu çalıştırıyorsunuz ve verilerin tasarım zamanında görünür olmasını bekliyorsunuz. gerçekten Windows olmayan kendi örneklerini oluşturun. Çalışma zamanında sadece iyi çalışır, ancak tasarım sırasında çalışmaz.

yapabileceğiniz birkaç şey var: Bir UserControl

  • yılında

    • Wrap Burada ile geldim alternatif bir çözüm. Doğrudan bir UserControl veya Window numaralı başvuruda bulunmamanız için bir avantajı vardır, böylece üst kapsayıcıyı değiştirirseniz kodunuz kırılmaz. Bağlayıcı zaman DataContextWrapper

      namespace MyWPFApplication.Views { 
          public class DataContextWrapper : Grid 
          { 
      
          } 
      } 
      

      Sonra sadece bir Grid'dir

      <Window 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:views="clr-namespace:MyWPFApplication.Views" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     
      x:Class="MyWPFApplication.Views.UPCLabelPrinterWindow" 
      mc:Ignorable="d" 
      x:Name="LayoutRoot" 
      Title="UPCLabelPrinterWindow"> 
      
      <views:DataContextWrapper> 
          <DockPanel> 
           ... 
          </DockPanel> 
      </views:DataContextWrapper> 
      

    Bunu:

    <TextBlock Text="{Binding="{Binding DataContext.SomeText, 
        RelativeSource={RelativeSource AncestorType={x:Type views:DataContextWrapper}, 
        Mode=FindAncestor}}" /> 
    

    Not: Eğer bağlamak istiyorsanız Bir pencere kendisi bir özellik trickier ve muhtemelen bir bağımlılık mülkü ya da bunun gibi bir şeyle bağlanmalısınız. Ama MVVM kullanıyorsanız, bu benim bulduğum bir çözüm.

  • +0

    Benim Case 'AncestorType = {x: Type Window}' oldukça yardımcı oldu, çünkü AncestorType = UserControl bir şekilde benim pencereme işaret etmedi - normalde yaptığı gibi. – LuckyLikey

    İlgili konular