2013-06-07 21 views
9

Bazı DependencyProperties içeren bir UserControl oluşturdum (burada örnekte yalnızca bir string özelliği). Usercontrol'ı başlattığımda, UserControl'ün özelliğini ayarlayabilirim ve beklendiği gibi gösterilebilir. Statik metni Binding ile değiştirmeye çalıştığımda hiçbir şey gösterilmez. aşağıdaki gibiUserControl Bağımlılık ÖzelliğiProperty

Benim UserControl görünür:

<User Control x:Class="TestUserControBinding.MyUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="30" d:DesignWidth="100"> 
    <Grid> 
    <Label Content="{Binding MyText}"/> 
    </Grid> 
</UserControl> 

Kod Arkası geçerli:

namespace TestUserControBinding { 

    public partial class MyUserControl : UserControl { 
    public MyUserControl() { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public static readonly DependencyProperty MyTextProperty = 
        DependencyProperty.Register(
         "MyText", 
          typeof(string), 
          typeof(MyUserControl)); 

    public string MyText { 
     get { 
     return (string)GetValue(MyTextProperty); 
     } 
     set { 
     SetValue(MyTextProperty, value); 
     } 
    }// MyText 

    } 
} 

benim MainWindow içinde bu deneyin, her şey beklendiği gibi geçerli:

<Window x:Class="TestUserControBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TestUserControBinding" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
    <local:MyUserControl MyText="Hello World!"/> 
    </StackPanel> 
</Window> 

Ama Bu çalışmaz:

<Window x:Class="TestUserControBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TestUserControBinding" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
    <local:MyUserControl MyText="{Binding Path=Text}"/> 
    <Label Content="{Binding Path=Text}"/> 
    </StackPanel> 
</Window> 

etiketin davranışı doğru, yani Mülkiyet "Metin" ile hiçbir problem

benim hatam nedir var mı? Saatlerce düşünürüm, ama unuttuğum hiçbir şey bulamıyorum. senin UserControl aşağıdaki bağlanma ile

cevap

10

: Metnim mülkiyet eserleri doğrudan metin ayarı nasıl

<Label Content="{Binding MyText}"/> 

emin değilim. Bunun çalışması için DataContext'u UserControl'un bir yerinde ayarlamalısınız.

Ne olursa olsun, bu bağlanma sorunudur - senaryonuzu anladığım kadarıyla, 'un DataContext'una bağlamak istemezsiniz, çünkü bu bir MyText özelliğine sahip olmaz. UserControl'un kendisine ve özellikle oluşturduğunuz DependencyProperty'a bağlamak istiyorsunuz. Bunu yapmak için, aşağıdaki gibi bir RelativeSource bağlama kullanmanız gerekir:

<Label Content="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}, Path=MyText}"/> 

Bu myUserControl ve sonra orada Metnim özelliği bulmak için görsel ağaca gider. 'a bağlı olmayacaktır, UserControl'u nereye yerleştirdiğinize bağlı olarak değişecektir. Bu durumda

, local sen UserControl tanımlamak gerekir bir ad alanına başvurulmaktadır:

<UserControl x:Class="TestUserControBinding.MyUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TestUserControBinding" 
     ...> 

Ve İkinci örnek bu noktada çalışmalıdır.

+0

@Brian ... Kod "this.DataContext = this;" DataContext'i yerel olarak ayarlamaya dikkat etmelisiniz. Yapmamalı mı? – Nishant

+4

Oh, evet, bunu özledim. Ancak bir "UserControl" oluşturuyorsanız, 'DataContext' öğesini manuel olarak ayarlamanın iyi bir fikir olduğunu sanmıyorum. 'DataContext', kapsayıcıdan devralınan veya atanan bağlamı temsil etmeyi amaçlamaktadır. 'RelativeSource' bağlacı, standart DataContext devralma akışını kesintiye uğratmadan istenen sonucu ('Bağımlılık Özelliği'ne bağlanma') elde etmenizi sağlar. 'UserControl'ünüzün tüketicisi kendi' DataContext'lerini ayarlarsa, 'DataContext' 'i geçersiz kılmaya çalışın. –

+2

tam olarak sorun oldu.MyUserControl'ün DataContext'ini kendim ayarlamak yerine, 'MyUserControl'ün açılış etiketinde' x: Name = "MyName" 'ı kullanıyorum ve Bağlanma şu şekilde değişiyor:'