WPF,ValidationRule中的属性从未设置

时间:2010-08-26 17:45:53

标签: c# wpf validation xaml dependency-properties

我正在尝试将DataContext中的属性绑定到ValidationRule中的属性:

public class ReleaseValidationRule : ValidationRule
{
    // I want to bind a value from my DataContext to this property:
    public CheckboxViewModels ValidReleases { get; set; }
    ...
}

基于this thread,我创建了CheckboxViewModels类,只是作为List<CheckboxViewModel>的包装器,以便列表可以是DependencyProperty,这样我就可以绑定它。但是,在Validate上的ValidationRule方法中,ValidReleases列表始终为空。这是我的XAML:

<TextBox>
    <TextBox.Text>
        <Binding Path="Release" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:ReleaseValidationRule>
                    <local:ReleaseValidationRule.ValidReleases>
                        <local:CheckboxViewModels List="{Binding Path=Releases,
                            Converter={StaticResource debugConverter}}"/>
                    </local:ReleaseValidationRule.ValidReleases>
                </local:ReleaseValidationRule>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

我知道Releases属性(我绑定到List的{​​{1}}属性的内容)有内容,因为CheckboxViewModels位于{{1}之上显示TreeView的内容。我在TextBox绑定上的转换器什么也没做,它只是我可以设置断点的地方。有趣的是,转换器断点永远不会被击中。好像整行Releases永远不会被执行,因此CheckboxViewModels.List中的<local:CheckboxViewModels List="{Binding Path=Releases, Converter={StaticResource debugConverter}}"/>属性永远不会被设置。发生了什么事?

修改:这是ValidReleases的样子:

ValidationRule

3 个答案:

答案 0 :(得分:0)

在某处闻起来像是遗失了Property Changed通知。很难看出CheckboxModels是关于什么的,但是如果它是ObservableCollection你就会在没有任何额外工作的情况下更改属性。这有意义吗?

HTH,
Berryl

答案 1 :(得分:0)

好的,现在我觉得很傻。我在CheckboxViewModels设置了List = new List<CheckboxViewModel>()的构造函数。我认为这是以某种方式重置某些东西?我删除了该构造函数,List的初始值仅在RegisterDependencyProperty的{​​{1}}方法中设置。现在使用以下XAML按预期填充new PropertyMetadata(new List<CheckboxViewModel>())

ValidReleases

编辑:毕竟不是那么愚蠢:<TextBox> <TextBox.Text> <Binding Path="Release" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <local:ReleaseValidationRule ValidatesOnTargetUpdated="True"> <local:ReleaseValidationRule.ValidReleases> <local:CheckboxViewModels List="{Binding Path=Releases, Mode=OneWay}"/> </local:ReleaseValidationRule.ValidReleases> </local:ReleaseValidationRule> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> 中没有构造函数导致使用相同列表的类型CheckboxViewModels的两个依赖项属性,所以我有发布和其他CheckboxViewModels属性和另一个属性中的数据。将构造函数添加回Releases会导致CheckboxViewModels再次没有任何项目。我想我必须纠正错误的东西。

答案 2 :(得分:0)

我停止使用验证规则,而是关注this tutorial about implementing IDataErrorInfo。那是我的类实例在我进入this[string]以找出错误消息时完全初始化的。我试图传入的数据只是来自同一实例上另一个属性的数据。也就是说,我想使用Property1中的一些数据验证Property2。使用IDataErrorInfo,当我验证Property1并在必要时收集错误消息时,我可以根据需要访问Property2,而无需传递任何内容。