2014-12-29 3 views
2

Я пытаюсь проверить некоторые входные данные в WPF, и я использую прокси DataResource, как описано здесь: http://www.wpfmentor.com/2009/01/how-to-add-binding-to-property-on.htmlWPF Связывание ElementName повышает NullReferenceException

Итак, вот мой XAML (упрощенно):

<mvvm:BaseDataView 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:md="clr-namespace:Mfc.Mvvm.Master" 
    > 
<mvvm:BaseDataView.Resources> 
    <ResourceDictionary> 
     <md:DataResource x:Key="mmSS" BindingTarget="{Binding ElementName=tbMmss,Path=Text}"/> 
     <md:DataResource x:Key="mmTS" BindingTarget="{Binding ElementName=tbMmts,Path=Text}"/> 
    </ResourceDictionary> 
</mvvm:BaseDataView.Resources> 
... 
<TextBox x:Name="tbMmts" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="2" Grid.Column="1" Width="100" Margin="3,3,0,0"> 
      <TextBox.Text> 
       <Binding Path="MTS" UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
         <md:DoubleRangeValidationRule MinValue="10.0" MaxValue="5000.0"/> 
         <md:LessThanValidationRule> 
          <md:LessThanValidationRule.LessThanChecker> 
           <md:ProxyForComparisonString 
            CompareTo="{md:DataResourceBinding DataResource={StaticResource mmSS}}"> 
           </md:ProxyForComparisonString> 
          </md:LessThanValidationRule.LessThanChecker> 
         </md:LessThanValidationRule> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
... 

<TextBox x:Name="tbMmss" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="3" Grid.Column="1" Width="100" Margin="3,3,0,0"> 
      <TextBox.Text> 
       <Binding Path="STS" UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
         <md:DoubleRangeValidationRule MinValue="10.0" MaxValue="5000.0"/> 
         <md:GreaterThanValidationRule> 
          <md:GreaterThanValidationRule.GreaterThanChecker> 
           <md:ProxyForComparisonString 
            CompareTo="{md:DataResourceBinding DataResource={StaticResource mmTS}}"> 
           </md:ProxyForComparisonString> 
          </md:GreaterThanValidationRule.GreaterThanChecker> 
         </md:GreaterThanValidationRule> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 

Валидация отлично работает для второго текстового поля, но он сбой с NullReferenceException для сперва Текстовое поле. DataResource, кажется, не инициализируются, и отладка говорит

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=tbMmss'. BindingExpression:Path=Text; DataItem=null; target element is 'DataResource' 

Любые идеи? Спасибо!

+0

Адрес электронной почты: tbMmts находится на указанном вами пути. – ZoomVirus

+0

Я не совсем уверен, что понимаю, что вы имеете в виду. 'tbMss' - это TextBox, указанный в XAML, а' Path = Text' относится к свойству Text, указанному TextBox. – Digifaktur

+0

Sry я пропустил чтение. В этой строке '' вы привязываетесь к объекту, где text == "" или null – ZoomVirus

ответ

1

У вас есть совершенно неправильный подход для этого. Не используйте Freezables. Они плохие. Они не хотят застревать в ресурсе и нарушаются, чтобы иметь дело с мостами !!! Пожалуйста, используйте прилагаемые свойства или информацию INotifyDataError, чтобы решить эту проблему как можно чище и правильно.

+0

Я согласен с частью нарушения - однако он не решает проблему * Проверка на другое значение * - 'ValidationRule' не реализует' DependencyObject', поэтому свойства находятся прямо, и они не находятся в одном логическом дереве (так что у них нет родителя «FrameworkElement», с которым вы могли бы привязываться). Спасибо, в любом случае, я буду исследовать дальше! – Digifaktur

+0

Используйте два привязки в свойстве MultiBinding on Text с ValidationRule, обрабатывающим эти два значения. Тогда у вас есть все, что вам нужно. –

+0

. В итоге я реализовал «двойной прокси», как описано в http://www.11011.net/wpf-binding-properties и http://michlg.wordpress.com/tag/ validationrule /: – Digifaktur

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