DataGridTextColumn ValidationRule с параметром hibernateConnector не работает

Я пытаюсь реализовать ValidationRule для DataGridTextColumn, который должен проверять допустимость значений NULL для свойства 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 имеет значение null.

Так что я делаю неправильно здесь? Имеет ли это отношение к BindingProxy (все примеры, которые я видел, по-видимому, имеют один и тот же код)?


person user7399085    schedule 20.07.2018    source источник


Ответы (1)


Мне нужно было некоторое время, чтобы понять «контекст данных», но думаю, что тем временем я решил свой собственный вопрос:

я переехал

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

to

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

и добавил строку в

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

Эту строку я пропустил в приведенном выше примере! Теперь Wrapper.hibernateConnector устанавливается, когда дело доходит до проверки.

person user7399085    schedule 22.07.2018