Как привязать локальное свойство к управлению в WPF - PullRequest
22 голосов
/ 20 декабря 2011

У меня есть два элемента управления на 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}" />

Поскольку мы видим, что метка привязана к локальному свойству (в коде Behind), я не вижу никакого значения на метке при нажатии кнопки ...

Ниже мой код позади ...

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";
}

С уважением,

Ответы [ 2 ]

39 голосов
/ 20 декабря 2011

1001 * попробовать *

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

без привязки DataContext

EDIT

У меня нет проблем с вашим кодом, я назвал ваше окно 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>

а ваше окно действительно 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";
  }
}

надеюсь, что это поможет

5 голосов
/ 20 декабря 2011

В настоящее время вы привязываете DataContext вашего ярлыка к Button, а затем пытаетесь установить его Content на CompanyName, однако CompanyName не является допустимым свойством Button

Укажите DataContext в привязке Path для привязки к Button.DataContext.CompanyName вместо Button.CompanyName

Кроме того, я бы рекомендовал просто привязывать Контент вместо того, чтобы связывать и DataContext, и Контент

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

И если ваш код выглядит точно так же, как приведенный пример кода, то и Button, и Label имеют одинаковый DataContext, так что вы можете связать непосредственно с CompanyName

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

Редактировать

Просто заметил, что привязка вашей метки была к элементу управления с именем _this. Я предполагал, что это была Кнопка, хотя теперь я вижу, что имя вашей Кнопки - btnChange, а не _this.

Хотя это и не важно, ответ остается прежним. Вы пытаетесь привязать свойство CompanyName элемента управления пользовательского интерфейса, которое не является допустимым.

...