Привязка свойства зависимости - назначьте новое значение - PullRequest
1 голос
/ 03 января 2012

Я реализовал простое свойство DependencyProperty в своем элементе управления WPF, чтобы использовать его в Binding.

public static readonly DependencyProperty PollingProperty = DependencyProperty.Register("Polling", typeof(Polling), typeof(ConverterView), new UIPropertyMetadata(null));

public Polling Polling
{
    get { return (Polling)GetValue(PollingProperty); }
    set { SetValue(PollingProperty, value); }
}

Сам элемент управления установлен как DataContext, поэтому в XAML я просто использую его так:

<ProgressBar Height="25" Value="{Binding Path=Polling.Progress, Mode=OneWay}" />

Polling.Progress - целочисленное свойство, которое реализует INoftiyPropertyChanged, поэтому изменения переносятся в пользовательский интерфейс. Все работает нормально, и изменения на «Прогресс» отображаются в ProgressBar, как и ожидалось.

Однако в моем приложении есть определенный момент, когда к DependencyProperty применяется новый экземпляр "Polling".

Polling = new Polling(); Polling.Start();

После этого привязка больше не оценивается, и ProgressBar остается на последнем значении старого экземпляра.

Обновление:

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

Кнопка на WPF-Control ConverterView позволяет пользователю начать операцию:

private void cmdAusformatieren_Click(object sender, RoutedEventArgs e)
{
    Polling = Document.Converter(ConvertFinished);
}

Convert-метод принимает делегата в качестве параметра, который будет вызван после завершения операции. (Весь процесс выполняется асинхронно.) Метод Convert возвращает Polling -объект, который предоставляет целочисленное свойство Progress, которое предоставляет информацию, которую я хочу отобразить в ProgressBar. (Что может вводить в заблуждение, опрос - это имя моего DependencyProperty, а также имя моего класса).

Насколько это все нормально, и Привязка к опросу. Прогресс работает.

В моем случае ConvertFinished (), который срабатывает после выполнения первой операции, я получаю новый экземпляр Polling и хочу использовать его в Binding с тех пор.

private void ConvertFinished(object result)
{           
    Polling = Document.Format((byte[])result, FormatFinished);
}

После этого присвоения моему опросу DependencyProperty привязка больше не обновляется и остается с прежним значением.

Ответы [ 3 ]

1 голос
/ 03 января 2012

Вместо

Polling = new Polling () ;

вам нужно написать

SetCurrentValue (PollingProperty, new Polling ()) ;

При непосредственном назначении свойства зависимостей все привязки к нему теряются.OTOH SetCurrentValue не влияет на привязки, он просто устанавливает текущее значение (duh) и распространяет уведомления.

0 голосов
/ 03 января 2012

Хорошо, не могли бы вы попробовать это:

BindingOperations.ClearBinding (this.YouProgressBarName, ProgressBar.ValueProperty); BindingOperations.SetBinding (this.YouProgressBarName, ProgressBar.ValueProperty);

сначала и проверьте, работает ли он. Я предсказываю, что не будет.

Есть одна вещь, которую я бы предложил изменить - избавиться от подвойств (я понимаю, что вы используете сложные объекты, чтобы уменьшить числовые параметры в ваших делах). Они ограничены поддержкой со стороны WPF.

Еще одна вещь, которую я бы попробовал, это принудительно установить значение свойства Polling в 0 непосредственно перед присвоением ему нового значения

private void cmdAusformatieren_Click(object sender, RoutedEventArgs e)
{
    this.Polling.Progress = 0; // see if make any difference
    this.Polling = Document.Converter(ConvertFinished);

    if (this.Polling.Progress != 0) { throw new Exception(); }
}
0 голосов
/ 03 января 2012

Самое простое решение, в данном случае, это переназначить a binding, на данный момент из кода во время выполнения.Потому что, как вы также заметили, привязка содержит ссылку на объект, которому было сначала назначено.

...