Задать содержимое метки с помощью свойства зависимости - PullRequest
2 голосов
/ 18 августа 2010

Мне сложно понять, как можно использовать свойства зависимости между C # и кодом xaml.Это небольшой пример кода моего вопроса

Код 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>

Код 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";
    }
}

Итак, моя проблемаэта метка statusTextLabel не обновляется, когда я нажимаю на кнопку.Моя проблема в том, что я не знаю, в какой части кода я что-то не так делаю, в xaml или в C #?В XAML я мог бы сделать что-то не так в Binding?Или я что-то пропустил в коде C #?

1 Ответ

2 голосов
/ 18 августа 2010

По умолчанию пути привязки относятся к свойству DataContext текущего элемента. Вы ничего не установили, поэтому он не может разрешить привязку. Если вам нужно свойство StatusText в вашем классе окна, то есть два подхода. Одним из них является использование привязки с RelativeSource of FindAncestor для поиска окна в дереве и прямой привязки к его свойствам:

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

Другой способ - установить для DataContext окна значение, которое будет наследоваться меткой. Например, в вашем конструкторе:

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

Для большинства приложений вы фактически захотите, чтобы отдельный класс представлял данные, и вы установите экземпляр этого класса как DataContext. Вы также можете использовать обычные свойства CLR вместо свойств зависимостей, хотя вам нужно будет реализовать INotifyPropertyChanged, если вы хотите, чтобы пользовательский интерфейс был информирован об изменении свойств. Свойства зависимостей более полезны, когда вы пишете пользовательский элемент управления и хотите, чтобы пользователи могли устанавливать свойства с помощью привязки данных.

...