2010-01-06 82 views
1

Silverlight的DataInput中:標籤DataInput中:DescriptionViewer控制通過其結合到一個TextBox能力提供有用的功能。我不想用System.ComponentModel.DataAnnotations.DisplayAttribute對標籤和描述的文本內容進行硬編碼,而寧願將這些屬性綁定到包含管理可編輯文本的類的屬性。這適用於Label,但不適用於DescriptionViewer。結合Silverlight 3中描述屬性:DescriptionViewer

具體來說,這個標籤的工作原理:

<dataInput:Label Grid.Row="00" Grid.Column="0" 
Target="{Binding ElementName=inpStatus}" 
Content="{Binding StatusLabel}" IsRequired="true" /> 

但這DescriptionViewer是無形的:

<dataInput:DescriptionViewer Grid.Row="00" Grid.Column="3" 
Target="{Binding ElementName=inpStatus}" 
Name="dvBound2" Description="{Binding Path=StatusDescription}" /> 

當我刪除綁定到我的文本框,在DescriptionViewer所示:

<dataInput:DescriptionViewer Grid.Row="00" Grid.Column="2" 
Name="dvBound1" Description="{Binding Path=StatusDescription}" /> 

應該可以將描述查看器綁定到文本框和替代描述來源?

在此先感謝!

MainPage.xaml中:

<UserControl x:Class="DataInputDemo.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit" 
    xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" 
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> 
    <Grid x:Name="LayoutRoot"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="142"></ColumnDefinition> 
      <ColumnDefinition Width="100"/> 
      <ColumnDefinition Width="24"></ColumnDefinition> 
      <ColumnDefinition Width="24"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"></RowDefinition> 
      <RowDefinition Height="30"></RowDefinition> 
     </Grid.RowDefinitions> 

     <dataInput:Label    Grid.Row="00" Grid.Column="0" 
      Target="{Binding ElementName=inpStatus}" 
      Content="{Binding StatusLabel}" IsRequired="true" /> 

     <TextBox      Grid.Row="00" Grid.Column="1" 
      Text="{Binding Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True, Path=Status}" 
      Name="inpStatus" MaxLength="025" 
      BindingValidationError="_BindingValidationError" /> 

     <dataInput:DescriptionViewer Grid.Row="00" Grid.Column="2" 
      Name="dvBound1" Description="{Binding Path=StatusDescription}" /> 

     <!-- Following DescriptionViewer is not shown. --> 
     <dataInput:DescriptionViewer Grid.Row="00" Grid.Column="3" 
      Target="{Binding ElementName=inpStatus}" 
      Name="dvBound2" Description="{Binding Path=StatusDescription}" /> 

     <dataInput:ValidationSummary Grid.Row="01" Grid.Column="0" 
      Grid.ColumnSpan="4" Name="VS1" /> 

    </Grid> 
</UserControl> 

MainPage.xaml.vb:

Partial Public Class MainPage 
    Inherits UserControl 

    Public myDataClass = New DataClass 

    Public Sub New() 
     InitializeComponent() 
     myDataClass.status = "Default Status" 
     myDataClass.StatusLabel = "Status Label" 
     myDataClass.StatusDescription = "Status Description" 
     LayoutRoot.DataContext = myDataClass 
    End Sub 

    Private Sub _BindingValidationError(ByVal sender As Object, ByVal e As ValidationErrorEventArgs) 
    End Sub 

End Class 

DataClass.vb:

Imports System.Collections.ObjectModel 
Imports System.ComponentModel 
Imports System.Runtime.Serialization 
Imports System.ComponentModel.DataAnnotations 
Imports System.Windows.Controls 

Public Class DataClass 

    Implements INotifyPropertyChanged 

    Public Event PropertyChanged As PropertyChangedEventHandler _ 
     Implements INotifyPropertyChanged.PropertyChanged 

    Private Sub NotifyPropertyChanged(ByVal info As String) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info)) 
    End Sub 

    Function ValidateEntry(ByVal fieldname As String, ByRef value As Object) As Object 
     Dim ctx As New ValidationContext(Me, Nothing, Nothing) 
     ctx.MemberName = fieldname 
     Validator.ValidateProperty(value, ctx) 
     Return value 
    End Function 

    <DataMember()> _ 
    <Required()> _ 
    <StringLength(100)> _ 
    Public Property Status() As String 
     Get 
      Return _Status 
     End Get 
     Set(ByVal value As String) 
      _Status = ValidateEntry("Status", value) 
      NotifyPropertyChanged("") 
     End Set 
    End Property 
    Private _Status As String 

    <DataMember()> _ 
    Public Property StatusLabel() As String 
     Get 
      Return _StatusLabel 
     End Get 
     Set(ByVal value As String) 
      _StatusLabel = value 
      NotifyPropertyChanged("") 
     End Set 
    End Property 
    Private _StatusLabel As String 

    <DataMember()> _ 
    Public Property StatusDescription() As String 
     Get 
      Return _StatusDescription 
     End Get 
     Set(ByVal value As String) 
      _StatusDescription = value 
      NotifyPropertyChanged("") 
     End Set 
    End Property 
    Private _StatusDescription As String 

End Class 

回答

1

我不得不使用這個DescriptionViewer完全相同的問題標記:

<TextBox x:Name="UserNameTextBox" Text="{Binding UserName, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true, UpdateSourceTrigger=Explicit}" Grid.Column="1" Grid.Row="1"></TextBox> 
<dataInput:DescriptionViewer Target="{Binding ElementName=UserNameTextBox}" Description="{Binding Path=CreateUserResources.UserNameDescription, Source={StaticResource GlobalResources}}" Grid.Column="2" Grid.Row="1"></dataInput:DescriptionViewer> 

將描述綁定到它的資源之前,它是標記中的一個純字符串,它確實工作。

要解決此問題,我已使用屬性名稱來設置DescriptionViewer的PropertyPath,其中綁定位於目標控件上。它現在工作正常。

<TextBox x:Name="UserNameTextBox" Text="{Binding UserName, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true, UpdateSourceTrigger=Explicit}" Grid.Column="1" Grid.Row="1"></TextBox> 
<dataInput:DescriptionViewer Target="{Binding ElementName=UserNameTextBox}" PropertyPath="Text" Description="{Binding Path=CreateUserResources.UserNameDescription, Source={StaticResource GlobalResources}}" Grid.Column="2" Grid.Row="1"></dataInput:DescriptionViewer> 

如果您使用MVVM,請確保PropertyPath與演示者模型的屬性不匹配。我沒有進行調查,但我有一個例子,我被迫更改了演示者的屬性名稱以使其工作。似乎控件試圖從我的演示者的屬性中解析元數據,而不是目標控件。

希望得到這個幫助。