web-dev-qa-db-fra.com

Comment lier une propriété locale sur le contrôle dans WPF

J'ai deux contrôles sur WPF

<Button HorizontalAlignment="Center"
        Name="btnChange"
        Click="btnChange_Click"
        Content="Click Me" />

<Label Name="lblCompanyId"
       HorizontalAlignment="Center"
       DataContext="{Binding ElementName=_this}"
       Content="{Binding Path=CompanyName}" />

Comme nous pouvons voir que l'étiquette est liée à une propriété locale (dans le code Derrière), je ne vois aucune valeur sur l'étiquette lorsque je clique sur le bouton ...

Voici mon code derrière ...

public static readonly DependencyProperty CompanyNameProperty =
  DependencyProperty.Register("CompanyName", typeof(string), typeof(Window3), new UIPropertyMetadata(string.Empty));

public string CompanyName {
  get { return (string)this.GetValue(CompanyNameProperty); }
  set { this.SetValue(CompanyNameProperty, value); }
}

private void btnChange_Click(object sender, RoutedEventArgs e) {
  this.CompanyName = "This is new company from code beind";
}

Cordialement,

24
usergaro

essayer

Content="{Binding ElementName=_this, Path=CompanyName}"

sans la liaison DataContext

MODIFIER

je n'ai aucun problème avec votre code, j'ai nommé votre fenêtre en x:Name="_this"?

<Window x:Class="WpfStackOverflowSpielWiese.Window3"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="Window3"
        Height="300"
        Width="300"
        x:Name="_this">
  <Grid>
    <StackPanel>
      <Button HorizontalAlignment="Center"
              Name="btnChange"
              Click="btnChange_Click"
              Content="Click Me" />

      <Label Name="lblCompanyId"
             HorizontalAlignment="Center"
             DataContext="{Binding ElementName=_this}"
             Content="{Binding Path=CompanyName}"></Label>

    </StackPanel>
  </Grid>
</Window>

et votre fenêtre est-elle vraiment Window3?

public partial class Window3 : Window
{
  public Window3() {
    this.InitializeComponent();
  }

  public static readonly DependencyProperty CompanyNameProperty =
    DependencyProperty.Register("CompanyName", typeof(string), typeof(Window3), new UIPropertyMetadata(string.Empty));

  public string CompanyName {
    get { return (string)this.GetValue(CompanyNameProperty); }
    set { this.SetValue(CompanyNameProperty, value); }
  }

  private void btnChange_Click(object sender, RoutedEventArgs e) {
    this.CompanyName = "This is new company from code beind";
  }
}

j'espère que cela pourra aider

42
punker76

Vous liez actuellement le DataContext de votre étiquette à un Button, puis vous essayez de définir son Content sur CompanyName, mais CompanyName n'est pas une propriété valide sur Button

Spécifiez DataContext dans votre liaison Path pour vous lier à Button.DataContext.CompanyName au lieu de Button.CompanyName

En outre, je recommanderais simplement de lier le contenu au lieu de lier à la fois le DataContext et le contenu

<Label Content="{Binding ElementName=btnChange, Path=DataContext.CompanyName}" />

Et si votre code ressemble exactement à l'exemple de code publié, alors Button et Label ont le même DataContext, vous pouvez donc vous lier directement à CompanyName

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

Modifier

Je viens de remarquer que la liaison de votre étiquette concernait un contrôle nommé _this. J'avais supposé que c'était le bouton, même si je vois maintenant que le nom de votre bouton est btnChange, pas _this.

Peu importe, la réponse est toujours la même. Vous essayez de vous lier à la propriété CompanyName d'un contrôle d'interface utilisateur, qui n'est pas une propriété valide.

5
Rachel