2011-01-21 9 views
7

в одном из моих приложений у меня есть такой код:WPF Binding режим по умолчанию

<ProgressBar Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Height="27" Margin="5,0,5,0" Maximum="{Binding TabuProgressEnd}" Value="{Binding TabuProgress}" /> 

В то время как я проверял это все нормально, но когда мой клиент открыл это под VS и запустить этот код бросил исключение :

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll 

Additional information: A TwoWay or OneWayToSource binding cannot work on the read-only property 'TabuProgress' of type 'TSPLib.TabuEngine'. 

Обычно я думаю, что это какой-то обман, но я знаю, что парень не имеет ни малейшего представления о кодировании и сделать «Mode = OneWay» явно помогло. Как возможно, что режим привязки по умолчанию отличается на разных машинах?

+0

Это звучит как вопрос версии с рамками. Я не уверен, когда режим привязки по умолчанию изменился, но он мог быть в одном из пакетов обновлений (или исправлении). Кажется, что были некоторые из этих странных изменений за эти годы, и их сложно отслеживать. Какую версию вы планируете? –

+0

Net Framework 4.0, установленный с Visual Studio 2010. Я не могу быть уверен, но это может быть что-то новое, потому что мой клиент установил пробную версию VS Pro, как два дня назад. Возможно, это с Sp1 .. – kubal5003

ответ

4

Value свойство в ProgressBar связывает TwoWay по умолчанию, так что исключение должно произойти, если явно не установлено Mode в OneWay. Однако я не могу объяснить, почему это не происходит на вашей машине. Я попытался использовать Reflector с версиями .NET 4.0, 3.5 и 3.0, и, насколько я могу судить, режим привязки по умолчанию не изменился через некоторое время.

Если вы установили отражатель, было бы интересно посмотреть, что ValueProperty (унаследованный от RangeBase) выглядит как на вашей машине

public static readonly DependencyProperty ValueProperty = 
    DependencyProperty.Register(
     "Value", 
     typeof(double), 
     typeof(RangeBase), 
     new FrameworkPropertyMetadata(
      0.0, 
      FrameworkPropertyMetadataOptions.Journal | 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
      new PropertyChangedCallback(RangeBase.OnValueChanged), 
      new CoerceValueCallback(RangeBase.ConstrainToRange)), 
     new ValidateValueCallback(RangeBase.IsValidDoubleValue)); 
+0

Спасибо за ваш ответ. Прежде всего, я узнал, что режим привязки по умолчанию может быть установлен в метаданных DP - я буду определенно более осторожен в этом в будущем. Я проверил приведенный выше код в своей структуре, а также включил BindsTwoWayByDefault. Это странно.. – kubal5003