Как передать представление списка в качестве параметра правилу проверки шаблона ячейки

#wpf #validation #xaml #listview #data-binding

#wpf #проверка #xaml #просмотр списка #привязка к данным #listview

Вопрос:

У меня есть шаблон ячейки для listview, который определяется следующим образом:

 <DataTemplate x:Key="editableIPAddressColTemplate">
    <Grid x:Name="dtTemplateGrid">
        <TextBlock Width="100" FontSize="11" Text="{Binding ElementName=txt, Path=Text, Mode=TwoWay}" 
                   ToolTip="{Binding ElementName=txt, Path=ToolTip, Mode=OneWay}"
                        Style="{StaticResource GridBlockStyle}">
        </TextBlock>
        <TextBox x:Name="txt" FontSize="11" Width="100" Style="{StaticResource GridEditStyle}"
                 Validation.Error="TextBox_Error" LostFocus="txt_LostFocus" >
            <Binding Path="IPAddress" Mode="TwoWay" ValidatesOnDataErrors="True" 
                     ValidatesOnExceptions="True" NotifyOnValidationError="True">
                <Binding.ValidationRules>
                    <local:IPAddressValidationRule>
                        <local:IPAddressValidationRule.Params>
                            <local:ValidationParameters BoundListView="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}}"/>
                        </local:IPAddressValidationRule.Params>
                    </local:IPAddressValidationRule>
                </Binding.ValidationRules> 
            </Binding>
        </TextBox>
    </Grid>                
</DataTemplate>
  

IPAddressValidationRule является производным от ValidationRule и имеет свойство, называемое Params, которое имеет тип ValidationParameters. Класс ValidationParameters является производным от объекта dependency и имеет свойство, называемое BoundListView, которое имеет тип ListView.

Когда я просматриваю через отладчик, в классе IPValidationRule свойство BoundListView всегда равно null. Что я делаю не так?

Я был бы очень признателен, если кто-нибудь сможет помочь мне разобраться в этом.

Заранее большое спасибо.

Ответ №1:

У вас разрыв в дереве, правила проверки просто перемещаются как свойство привязки, вы не можете использовать ElementName or RelativeSource в таком отключенном месте. Проверьте окно вывода, и вы должны увидеть некоторые ошибки привязки, касающиеся этого.

Вы могли бы попробовать назвать ListView и установить Binding.Source с помощью x:Reference ( x:Reference не любит циклических зависимостей, поэтому вам нужно следить за этим)