2010-08-18 10 views
1

J'ai du mal à comprendre comment les propriétés de dépendance peuvent être utilisées entre le code C# et le code xaml. Ceci est un exemple de code Smal de ma questionDéfinition d'un contenu d'étiquette avec une propriété Dependency

code XAML:

<Window x:Class="WpfChangeTextApplication.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<StackPanel> 
    <Label Name="statusTextLabel" Content="{Binding StatusText}"></Label> 
    <Button Name="changeStatusTextButton" Click="changeStatusTextButton_Click">Change Text</Button> 
</StackPanel> 

code C#:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent();    
    } 

    public string StatusText 
    { 
     get { return (string)GetValue(StatusTextProperty); } 
     set { SetValue(StatusTextProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for StatusText. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty StatusTextProperty = 
     DependencyProperty.Register("StatusText", typeof(string), typeof(MainWindow)); 

    private void changeStatusTextButton_Click(object sender, RoutedEventArgs e) 
    { 
     StatusText = "Button clicked"; 
    } 
} 

Donc, mon problème est que l'étiquette statusTextLabel dose pas mis à jour quand je clique sur le bouton. Mon problème est que je ne sais pas dans quelle partie du code je fais quelque chose de mal, est-ce dans le xaml ou dans le C#? Dans le xaml, je pourrais faire quelque chose de mal dans la liaison? Ou ai-je manqué de faire quelque chose dans le code C#?

Répondre

2

Par défaut, les chemins de liaison sont relatifs à la propriété DataContext de l'élément en cours. Vous ne l'avez pas défini, donc il ne peut pas résoudre la liaison. Si vous voulez la propriété StatusText sur votre classe de fenêtre, il existe deux approches. La première consiste à utiliser une liaison avec une RelativeSource de FindAncestor pour trouver la fenêtre dans l'arbre et se lier à ses propriétés directement:

<Label Name="statusTextLabel" Content="{Binding StatusText, 
    RelativeSource={RelativeSource AncestorType=Window}}"></Label> 

L'autre est de définir le DataContext de la fenêtre pour lui-même, il en héritera par l'étiquette. Par exemple, dans votre constructeur:

public MainWindow() 
{ 
    this.DataContext = this; 
    InitializeComponent(); 
} 

Pour la plupart des applications, vous voulez vraiment une catégorie distincte pour représenter les données, et vous allez définir une instance de cette classe comme DataContext. Vous pouvez également utiliser les propriétés CLR ordinaires à la place des propriétés de dépendance, bien que vous deviez implémenter INotifyPropertyChanged si vous souhaitez que l'interface utilisateur soit informée lorsque les propriétés changent. Les propriétés de dépendance sont plus utiles lorsque vous écrivez un contrôle personnalisé et que vous souhaitez que les utilisateurs puissent définir les propriétés à l'aide de la liaison de données.