在ListView中使用带有ValidationRules的ComboBox

时间:2014-07-09 14:42:28

标签: wpf validation combobox validationrules

我有一个Listview,其中包含一个包含TextBox的列和另一个包含ComboBox的列。

此验证适用于TextBox:

<GridViewColumn Header="SQL Server">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBox Width="140">
                <TextBox.Text>
                    <Binding Path="Server" Mode="TwoWay" NotifyOnValidationError="True" 
                             ValidatesOnExceptions="True" ValidatesOnDataErrors="True" 
                             UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <helpers:DatabaseServerNameValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

但是当我使用ComboBox尝试相同的方法时,我的验证器永远不会被调用:

<GridViewColumn Header="Database Type">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ComboBox Width="140" ItemsSource="{Binding Source={StaticResource DatabaseTypeFromEnum}}" SelectedItem="{Binding DatabaseType, Mode=TwoWay}">
                <ComboBox.SelectedValue>
                    <Binding Path="DatabaseType" 
                             NotifyOnValidationError="True" 
                             ValidatesOnExceptions="True" 
                             ValidatesOnDataErrors="True" 
                             UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <helpers:DatabaseTypeValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </ComboBox.SelectedValue>
            </ComboBox>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我还尝试将<ComboBox.SelectedValue>替换为<ComboBox.SelectedValuePath>,但效果不佳。

我的问题可能在于ComboBox的绑定路径,但我现在只是吵架。

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是您为comboBox绑定了 SelectedItem SelectedValue 。此外,他们与同一财产捆绑在一起。

摆脱SelectedItem绑定 ,它会正常工作。 (SelectedItem优先于SelectedValue)

<GridViewColumn Header="Database Type">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ComboBox Width="140"
                      ItemsSource="{Binding Source={StaticResource 
                                                    DatabaseTypeFromEnum}}">
                <ComboBox.SelectedValue>
                    <Binding Path="DatabaseType" 
                             NotifyOnValidationError="True" 
                             ValidatesOnExceptions="True" 
                             ValidatesOnDataErrors="True" 
                             UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <helpers:DatabaseTypeValidationRule />
                        </Binding.ValidationRules>
                    </Binding>
                </ComboBox.SelectedValue>
            </ComboBox>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>