簡體   English   中英

如何將實現IDataErrorInfo的視圖模型綁定到UserControl並傳播驗證錯誤?

[英]How do you bind a viewmodel which implements IDataErrorInfo to a UserControl and propagate the validation errors?

我編寫了一個UserControl,它公開了一些依賴項屬性以修改控件的布局(即,將其視為通用的類型安全的編輯器控件-因此,我的數據類型是日期(通過日期選擇器編輯),枚舉(已編輯) (通過組合框)和數字(通過文本框編輯)。我還公開了3個編輯器控件的值作為依賴項屬性,以便可以進行數據綁定。

用戶控件中的控件都綁定到公開的依賴項屬性以獲取其值(必要時使用適當的轉換器)。

此控件形成了一個較大的UI的很小一部分,該UI綁定到了視圖模型-要編輯的值,自定義控件的數據類型標志以及可能的有效值列表都綁定到了視圖模型中的對象。

我的問題是:我已經在viewmodel上實現了IDataErrorInfo,並在自定義usercontrol中設置了控件的綁定,以使ValidatesOnDataErrors=True, NotifyOnValidationError=True但未顯示驗證。

這是我的用戶控件的XAML(除了依賴項屬性聲明外,沒有其他代碼隱藏邏輯):

<UserControl.Resources>
    <!-- Converters -->
    <local:ValidationBooleanToImageConverter x:Key="ValidationBooleanToImageConverter"/>
    <local:ValidationErrorToStringConverter x:Key="ValidationErrorToStringConverter"/>
    <local:DataTypeToVisibilityConverter DataType="Date" x:Key="DateDataTypeToVisibilityConverter"/>
    <local:DataTypeToVisibilityConverter DataType="Numeric" x:Key="NumericDataTypeToVisibilityConverter"/>
    <local:DataTypeToVisibilityConverter DataType="Enumeration" x:Key="EnumerationDataTypeToVisibilityConverter"/>
    <local:DateToStringConverter x:Key="DateToStringConverter"/>
    <!-- Styles -->
    <Style TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem, Converter={StaticResource ResourceKey=ValidationErrorToStringConverter}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="16"/>
    </Grid.ColumnDefinitions>
    <toolkit:DatePicker Height="25" Margin="0,0,5,0" Visibility="{Binding Path=DataType, ElementName=UserControl, Converter={StaticResource ResourceKey=DateDataTypeToVisibilityConverter}}" SelectedDate="{Binding Path=Value, ElementName=UserControl, Converter={StaticResource ResourceKey=DateToStringConverter}}"/>
    <ComboBox Height="25" Margin="0,0,5,0" Visibility="{Binding Path=DataType, ElementName=UserControl, Converter={StaticResource ResourceKey=EnumerationDataTypeToVisibilityConverter}}" SelectedItem="{Binding Path=Value, ElementName=UserControl, Mode=TwoWay}" ItemsSource="{Binding Path=Items, ElementName=UserControl}" />
    <TextBox x:Name="_txtValue" Height="25" Margin="0,0,5,0" Visibility="{Binding Path=DataType, ElementName=UserControl, Converter={StaticResource ResourceKey=NumericDataTypeToVisibilityConverter}}" Text="{Binding Path=Value, ElementName=UserControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
    <Image Grid.Column="2" Grid.Row="0" Source="{Binding ElementName=_txtValue, Path=(Validation.HasError), Converter={StaticResource ResourceKey=ValidationBooleanToImageConverter} }" ToolTip="{Binding ElementName=_txtValue, Path=ToolTip}" Width="16" Height="16"/>
</Grid>

...而較大視圖中的usercontrol參考是...

<control:ValueEditorControl DataType="{Binding Path=ContextualSelectedTagDataType}" Items="{Binding Path=ContextualSelectedTagItems}" Value="{Binding Path=ContextualSelectedTagDataObjectValue, Mode=TwoWay}" Height="25" VerticalAlignment="Top"/>

誰能指出我正確的方向?

您的VM是否實現INotifyPropertyChanged 即使在未通知WPF VM更改的情況下實現IDataErrorInfo ,它也不會綁定到這些更改。

話雖如此,我將您的工具提示設置器更改為:

<Setter Property="ToolTip"
            Value="{Binding RelativeSource={RelativeSource Self}, 
                   Path=(Validation.Errors)[0].ErrorContent}"/>

如果您想要整個樣式,我建議您這樣做:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <AdornedElementPlaceholder Name="controlWithError" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="LightPink"/>
            <Setter Property="ToolTip"
            Value="{Binding RelativeSource={RelativeSource Self}, 
                   Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM