2010-01-06 41 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与演示者模型的属性不匹配。我没有进行调查,但我有一个例子,我被迫更改了演示者的属性名称以使其工作。似乎控件试图从我的演示者的属性中解析元数据,而不是目标控件。

希望得到这个帮助。