JONLIN Ответов: 1

Как привязать код за переменными в WPF


Я пытаюсь привязать переменную типа string к элементу управления содержимым labals. Любая помощь, касающаяся привязки с использованием конвертеров и различных видов привязки, будет оценена по достоинству.

Что я уже пробовал:

Я пробовал привязывать свойство Window к себе и пытаться получить доступ к коду за переменными простым привязыванием к ним как таковым:
код XAML
<Window DataContext="{RelativeSource Self}" >
    <Label Content="{Binding Path=Hello}"/>
</Window>

Код C#
public partial class MainWindow : Window
{
    string Hello = "Hello World";
    public MainWindow()
    {
    }
}

Это действительно компилируется, но ничего не отображает. Любая обратная связь будет оценена.

1 Ответов

Рейтинг:
12

Matt T Heffron

Hello находиться как private и поле.
Любой из них разорвет связь.
Это должно быть ... public (или internal) собственность.
Попробуй:

public partial class MainWindow : Window
{
    private const string HelloMessage = "Hello World";
    public string Hello { get { return HelloMessage; } }

    public MainWindow()
    {
    }
}


=============
Редактирование: июня - 29 апреля 2016 года

Отображение привязки к свойству таким образом, чтобы метка могла обновляться при изменениях:
код XAML:
<Window>
    <Label Content="{Binding Path=Hello}"/>
</Window>
С#:
using System.ComponentModel;
using System.Runtime.CompilerServices;
public partial class MainWindow : Window, INotifyPropertyChanged
{
  public MainWindow()
  {
    InitializeComponent();
    DataContext = this;
  }
  private string _Hello = "Select Workflow Variant:";
  public string Hello
  { 
    get { return _Hello; }
    set
    { 
      _Hello = value;
      OnPropertyChanged();
    }
  }
  #region INotifyPropertyChanged Members

  public event PropertyChangedEventHandler PropertyChanged;

  /// <summary>
  /// Raises this object's PropertyChanged event.
  /// </summary>
  /// <param name="propertyName">The property that has a new value.</param>
  protected void OnPropertyChanged([CallerMemberName]string propertyName = null)
  {
    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
      var e = new PropertyChangedEventArgs(propertyName);
      handler(this, e);
    }
  }
  #endregion
}

Теперь, если Hello свойство изменяется, то Label будет обновляться. Аналогично определите и другие настраиваемые свойства.


JONLIN

Большое вам спасибо :) это первый прогресс, который у меня был за довольно долгое время. Во всяком случае, есть ли какая-то причина, по которой я не могу получить доступ к HelloMessage напрямую, а должен получить доступ к нему через поле?
Кроме того, как я могу получить ярлык для автоматического обновления, если источник изменится? Потому что я обнаружил, что ключевое слово Const не требуется, но оно не обновляет свойство Contet, если изменяется источник.
И все же спасибо что уделили мне время :)

Matt T Heffron

Это всего лишь одно из ограничений WPF, что привязки должны быть к свойству, а не к полю (или const).
Чтобы элементы управления WPF заметили, когда свойство, к которому они привязаны, изменило значение, DataContext (в данном случае само окно) должен реализовать интерфейс INotifyPropertyChanged, а затем вызывать событие PropertyChanged всякий раз, когда изменяется значение свойства.
Смотрите мое обновленное решение выше.

Member 14810750

Привет.
Я знаю, что прошло много времени с тех пор, как вы написали это, и, возможно, все пошло вперед, но мне интересно, можете ли вы мне помочь.
У меня возникли некоторые проблемы с методом OnPropertyChanged, так как обработчик всегда возвращает null.

Есть идеи, как это исправить?

#realJSOP

Напишите это как вопрос.

Member 14810750

Уже исправлено :)