未绑定窗口的绑定和转换器

时间:2013-08-25 18:00:31

标签: wpf vb.net validation idataerrorinfo

我有一个窗口,其中包含许多控件,这些控件不受任何其他限制。但是,我想应用一些特定于窗口的验证。我想我可以通过在窗口上实现IDataErrorInfo来做到这一点;并且还为单个控件/属性实现INotifyPropertyChanged,或者在窗口上公开依赖项属性并绑定到这些依赖项属性(这也允许我在这些控件上利用现有的ValueConverters)。这是可取的吗?这样做有什么缺点?

这就是我正在考虑的事项(XAML):

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="winInitialContact" x:Name="UC">
  <StackPanel>
    <Label Content="From" />
    <TextBox Text="{Binding FromTime, ElementName=UC, Converter={StaticResource TimeConverter}, ValidatesOnDataErrors=True}" />
    <Label Content="To" />
    <TextBox Text="{Binding ToTime, ElementName=UC, Converter={StaticResource TimeConverter}, ValidatesOnDataErrors=True}" />
  </StackPanel>
</Window>

和代码:

Imports System.ComponentModel

Class MainWindow
    Implements IDataErrorInfo
    Implements INotifyPropertyChanged

    Shared ReadOnly FromTimeProperty = DependencyProperty.Register("FromTime", GetType(TimeSpan?), GetType(MainWindow), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, Sub(s, e) DirectCast(s, MainWindow).RaisePropertyChanged("FromTime")))
    Property FromTime As TimeSpan?
        Get
            Return GetValue(FromTimeProperty)
        End Get
        Set(value As TimeSpan?)
            SetValue(FromTimeProperty, value)
        End Set
    End Property

    Shared ReadOnly ToTimeProperty = DependencyProperty.Register("ToTime", GetType(TimeSpan?), GetType(MainWindow), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, Sub(s, e) DirectCast(s, MainWindow).RaisePropertyChanged("ToTime")))
    Property ToTime As TimeSpan?
        Get
            Return GetValue(ToTimeProperty)
        End Get
        Set(value As TimeSpan?)
            SetValue(ToTimeProperty, value)
        End Set
    End Property

    Public ReadOnly Property [Error] As String Implements IDataErrorInfo.Error
        Get
            Return Nothing
        End Get
    End Property

    Default Public ReadOnly Property Item(columnName As String) As String Implements IDataErrorInfo.Item
        Get
            Select Case columnName
                Case "FromTime"
                    If Not FromTime.HasValue Then Return "Missing from time"
                Case "ToTime"
                    If Not ToTime.HasValue Then Return "Missing end time"
            End Select
            Return Nothing
        End Get
    End Property

    Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

    Sub RaisePropertyChanged(propName As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
    End Sub
End Class

0 个答案:

没有答案