【问题标题】:DataGridTextColumn ValidationRule with parameter hibernateConnector not working带有参数 hibernateConnector 的 DataGridTextColumn ValidationRule 不起作用
【发布时间】:2018-12-28 19:55:51
【问题描述】:

我尝试为 DataGridTextColumn 实现一个 ValidationRule,它应该针对 NHibernate 属性测试可空性。 检查实际上是在我的HibernateConnector.isNullable(String className, String propertyName) 方法中完成的。 因此,必须将 HibernateConnector 传递给 ValidationRule。

下面引用的 mynamespace.TeamsForm.xaml.cs 有public HibernateConnector hibernateConnector { get; set; }

由于我对 WPF/XAML 还很陌生,所以我使用 https://social.technet.microsoft.com/wiki/contents/articles/31422.wpf-passing-a-data-bound-value-to-a-validation-rule.aspx 作为示例来实现它。

包装类

public class HibernateConnectionWrapper : DependencyObject
{
    public static readonly DependencyProperty HibernateConnectorProperty =
         DependencyProperty.Register("hibernateConnector", typeof(HibernateConnector),
         typeof(HibernateConnectionWrapper), new FrameworkPropertyMetadata(null));

    public HibernateConnector hibernateConnector
    {
        get { return (HibernateConnector)GetValue(HibernateConnectorProperty); }
        set { SetValue(HibernateConnectorProperty, value); }
    }
}

绑定代理

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

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

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new PropertyMetadata(null));
}

验证类

public class EditRueckennummerValidationRule : ValidationRule
{
    public HibernateConnectionWrapper Wrapper { get; set; }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        bool n = Wrapper.hibernateConnector.isNullable(typeof(SpielerImTeam).FullName, "Rueckennummer");
        // ... more code

相关的 XAML 部分

<rcappbase:AbstractWorkAreaForm x:Class="mynamespace.TeamsForm"
  ...  
<DataGrid.Resources>
    <BindingProxy Data="{Binding}" x:Key="proxy"/>
</DataGrid.Resources>
<!-- other elements -->
<DataGridTextColumn Header="rueckennummer" IsReadOnly="False" DisplayIndex="5" >
    <DataGridTextColumn.Binding>
        <Binding Path="Rueckennummer" NotifyOnValidationError="True">
            <Binding.ValidationRules>
                <local:EditRueckennummerValidationRule>
                    <local:EditRueckennummerValidationRule.Wrapper>
                        <mynamespaceandassembly:HibernateConnectionWrapper  hibernateConnector="{Binding Path=Data.hibernateConnector, Source={StaticResource proxy}}"/>
                    </local:EditRueckennummerValidationRule.Wrapper>
                </local:EditRueckennummerValidationRule>
            </Binding.ValidationRules>  
        </Binding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>
<!-- more elements -->

我可以编译和运行代码,但在EditRueckennummerValidationRule.Validate(...) Wrapper.hibernateConnector.isNullable(...) hibernateConnector 为空

那么我在这里做错了什么? 它与 BindingProxy 有关吗(我看到的所有示例显然都有相同的代码)?

【问题讨论】:

    标签: c# wpf validationrules datagridtextcolumn


    【解决方案1】:

    我需要一段时间来理解“数据上下文”,但我认为我同时解决了我自己的问题:

    我搬家了

    <DataGrid.Resources>
        <BindingProxy Data="{Binding}" x:Key="proxy"/>
    </DataGrid.Resources>
    

    <rcappbase:AbstractWorkAreaForm.Resources>
        <BindingProxy Data="{Binding }" x:Key="proxy"/>
    </rcappbase:AbstractWorkAreaForm.Resources>
    

    并添加了一行

    public TeamsForm()
    {
        InitializeComponent();
        DataContext = this; // <-- !!!! set the data context
    }
    

    我在上面引用的示例中错过了这一行! 现在 Wrapper.hibernateConnector 在验证时已设置。

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2014-09-16
      • 2021-06-21
      • 1970-01-01
      • 2012-07-29
      • 2018-12-04
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多