如何将列表视图作为参数传递给单元格模板的验证规则

时间:2011-11-08 23:59:40

标签: wpf validation xaml listview data-binding

我有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类派生自依赖项对象,并且具有一个名为BoundListView的属性,该属性的类型为ListView。

当我看到调试器时,在IPValidationRule类中,BoundListView属性始终为null。我究竟做错了什么?

如果有人能帮助我弄清楚这一点,我将不胜感激。

提前多多感谢。

1 个答案:

答案 0 :(得分:2)

你在树中有一个中断,验证规则只是作为绑定的属性浮动,你不能在这样一个断开连接的地方使用ElementNameRelativeSource。检查输出窗口,你应该能够看到一些关于此的绑定错误。

您可以尝试命名ListView并使用x:Reference设置Binding.Sourcex:Reference不喜欢周期性依赖关系,因此您需要注意这一点)