2012-01-03 4 views
1

Я использовал простой 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 = new Polling(); Polling.Start(); 

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

Update:

В моем случае, может быть, немного специфический, я объясню немного больше.

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

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

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

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

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

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

После этого задания на мой Polling DependencyProperty, вязка больше не обновляется и остается с его предыдущим значением.

+0

Я добавил его к ответу только для удобства чтения. У вас есть доступ к вашему пользовательскому интерфейсу от ConvertFinished кстати? –

+0

Да, я вернулся в поток пользовательского интерфейса и могу выполнять любую операцию напрямую. – Roper

+0

Задействовал ли прогресс на 0? –

ответ

0

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

+0

Хм, это правильно? –

+0

@Dmitry: Это то, что я заметил из * моего * опыта – Tigran

+0

Интересно, как-то это меня не удивляет. Это очень сложно, хотя значение, отображаемое с использованием этой «липкой» привязки, может быть неправильным! Я не видел его сам, но это определенно одна из худших ошибок в WPF, если он exsits. –

0

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

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

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

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

Еще одна вещь, которую я хотел бы попробовать форсирует ваше опросом значение свойства равным 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

Экземпляр опроса устанавливается в первый раз после нажатия кнопки на конвертере. Все работает нормально, пока другое событие не создаст новый экземпляр опроса и не назначит его DP. – Roper

+0

@Roper Не могли бы вы вывести код из этого обработчика событий? «Path = Polling.Progress» означает, что опрос является свойством, а «Опрос = новый опрос(); Polling.Start();» говорит, что это что-то еще;) –

+0

@Roper Не могли бы вы опубликовать упрощенную версию вашего кода в качестве обновления для вашего вопроса? Также, когда многие «мандельбуги» вызваны асинхронными вызовами, можете ли вы запустить операцию синхронно, чтобы лишить эту возможность? –

1

Вместо

Polling = new Polling() ; 

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

SetCurrentValue (PollingProperty, new Polling()) ; 

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

+0

Это, кажется, имеет смысл, но, к сожалению, он не работает. Поведение такое же, как и раньше. Кроме того, я хотел бы избежать создания нового связывания в коде. – Roper

+0

Вы переписывали все присваивания кода для 'Polling' (кроме конструктора) для использования' SetCurrentValue'? Также я не понимаю, что вам нужно для создания привязок в коде. –

+0

У меня есть только назначения, и оба теперь используют SetCurrentValue. После первого все работает нормально (привязка - это обновления и т. Д.), Как и раньше. Моя конкретная строка кода: 'SetCurrentValue (PollingProperty, Document.Формат ((byte []) result, FormatFinished)); ' – Roper

Смежные вопросы