2017-06-19 30 views
0

我需要将绑定值发送到ValidationRule。我正在使用DependencyObject,但其值始终为nullValidationRule和DependencyObject

这里是我的DependencyObject

public class MyDependencyObject : DependencyObject 
{ 
    public string BindingValue 
    { 
     get { return (string)GetValue(BindingValueProperty); } 
     set { SetValue(BindingValueProperty, value); } 
    } 
    public static readonly DependencyProperty BindingValueProperty = 
     DependencyProperty.Register("BindingValue", typeof(string), typeof(MyDependencyObject), new UIPropertyMetadata(null));  
} 

这里是我的ValidationRule

public class MyTextBoxValidationRule : ValidationRule 
{ 
    private MyDependencyObject _TxtVal; 
    public MyDependencyObject TxtVal 
    { 
     get { return _TxtVal; } 
     set { _TxtVal = value; } 
    } 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     //Validation Logic 
    } 
} 

这里是XAML

<TextBox > 
    <TextBox.Text> 
     <Binding Path="DataUserTypes" 
      NotifyOnValidationError="True" 
      ValidatesOnDataErrors="True" 
      Mode="TwoWay" 
      UpdateSourceTrigger="PropertyChanged" 
      NotifyOnSourceUpdated="True" 
      NotifyOnTargetUpdated="True" 
      Delay="100"> 
      <Binding.ValidationRules> 
       <local:MyTextBoxValidationRule ValidatesOnTargetUpdated="True" > 
        <local:MyTextBoxValidationRule.TxtVal > 
         <local:MyDependencyObject 
          TxtVal="{Binding Path=ValidateValue}" /> 
        </local:MyTextBoxValidationRule.TxtVal> 
       </local:MyTextBoxValidationRule> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

当我通过验证的MyTextBoxValidationRuleTxtVal.BindingValue一步总是null。我不知道为什么

编辑:

我改变DisplayValueDataUserTypes因为似乎有一些混乱。

<Binding Path="DataUserTypes" 

这是文本框的Text值的绑定。我需要根据酒店ValidateValue验证DataUserTypes。我试图用DependencyObjectTxtVal来做到这一点。

我也修复了一个复制和粘贴类型。有一个叫TextValID的字段应该是TxtVal。对于那个很抱歉。

+1

'<地方:MyDependencyObject TEXTVALID = “{绑定路径= ValidateValue}”/>' - 什么是TextValID这里? – mechanic

+0

@ mechanic对不起,这是一个复制和粘贴错字。请参阅更新的编辑 – Xaphann

回答

2
<local:MyTextBoxValidationRule ValidatesOnTargetUpdated="True" > 
    <local:MyTextBoxValidationRule.TxtVal > 
     <local:MyDependencyObject 
      BindingValue="{Binding ValidateValue, PresentationTraceSources.TraceLevel=High}" 
      /> 
    </local:MyTextBoxValidationRule.TxtVal> 
</local:MyTextBoxValidationRule> 

PresentationTraceSources.TraceLevel=High产生在VS输出窗格中的下列跟踪输出:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=24230272) for Binding (hash=28316044) 
System.Windows.Data Warning: 58 : Path: 'ValidateValue' 
System.Windows.Data Warning: 60 : BindingExpression (hash=24230272): Default mode resolved to OneWay 
System.Windows.Data Warning: 61 : BindingExpression (hash=24230272): Default update trigger resolved to PropertyChanged 
System.Windows.Data Warning: 62 : BindingExpression (hash=24230272): Attach to Lines.MyDependencyObject.BindingValue (hash=37689768) 
System.Windows.Data Warning: 64 : BindingExpression (hash=24230272): Use Framework mentor <null> 
System.Windows.Data Warning: 67 : BindingExpression (hash=24230272): Resolving source 
System.Windows.Data Warning: 69 : BindingExpression (hash=24230272): Framework mentor not found 
System.Windows.Data Warning: 65 : BindingExpression (hash=24230272): Resolve source deferred 
'Lines.exe' (CLR v4.0.30319: Lines.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework.Aero\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.Aero.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
System.Windows.Data Warning: 67 : BindingExpression (hash=24230272): Resolving source 
System.Windows.Data Warning: 69 : BindingExpression (hash=24230272): Framework mentor not found 

长话短说,的local:MyDependencyObject该实例没有地方继承从DataContext,因为其父是不视觉树。

你可以使用a BindingProxy来解决这个问题,但是你绑定了什么? ValidateValue必须是某物的属性;但是什么?如果它的父视图模型的属性,这将做到这一点:

<TextBox.Resources> 
    <local:BindingProxy 
     x:Key="ViewmodelProxy" 
     Data="{Binding}" 
     /> 
</TextBox.Resources> 
<TextBox.Text> 
    <Binding Path="DataUserTypes" 
     NotifyOnValidationError="True" 
     ValidatesOnDataErrors="True" 
     Mode="TwoWay" 
     UpdateSourceTrigger="PropertyChanged" 
     NotifyOnSourceUpdated="True" 
     NotifyOnTargetUpdated="True" 
     Delay="100"> 
     <Binding.ValidationRules> 
      <local:MyTextBoxValidationRule ValidatesOnTargetUpdated="True" > 
       <local:MyTextBoxValidationRule.TxtVal> 
        <local:MyDependencyObject 
         BindingValue="{Binding Data.ValidateValue, Source={StaticResource ViewmodelProxy}}" 
         /> 
       </local:MyTextBoxValidationRule.TxtVal> 
      </local:MyTextBoxValidationRule> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 

绑定代理:

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 
+0

我已将DisplayValue重命名为DataUserTypes类型,并添加了一些评论,希望能够清除我正在尝试执行的操作。详细信息请见编辑 – Xaphann

+1

'MyDependencyObject'没有'TxtVal'属性,但是你在它上面绑定了一个XAML。这是一个错字吗? –

+1

@Xaphann查看更新。 –

相关问题