2011-09-15 71 views
1

驗證例外,我有一個用戶控制和我已綁定的依賴屬性TextValue到視圖模型RightSpecGlassStrength用戶控件不顯示在Silverlight

用戶控件代碼

<UserControl x:Class="NumericUpDown1" 
    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" 
    mc:Ignorable="d" 
    d:DesignHeight="25" d:DesignWidth="70"> 
    <StackPanel Orientation="Horizontal" VerticalAlignment="Top" > 
     <TextBox x:Name="InputTextBox" Grid.Row="0" Grid.Column="0" Grid.RowSpan="1" 
       Style="{StaticResource NumericUpDownTextBoxStyle}" 
       KeyDown="InputTextBox_KeyDown" 
       KeyUp="InputTextBox_KeyUp" 
       GotFocus="InputTextBox_GotFocus" 
       LostFocus="InputTextBox_LostFocus" 
       MouseWheel="InputTextBox_MouseWheel" 
       MouseEnter="InputTextBox_MouseEnter" 
       TextInputStart="InputTextBox_TextInputStart" 
       LayoutUpdated="InputTextBox_LayoutUpdated" 
       /> 
    </StackPanel> 

</UserControl> 

ViewItems.Xaml

<userControl:NumericUpDown1 x:Name="RightSpecGlassStrengthUpDown" Maximum="28" Minimum="-28" Step="0.25" TextValue="{Binding RightSpecGlassStrength, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" TabIndex="5" /> 

ViewItemsViewModel.cs

public class ViewItemsViewModel : EntityViewModel 
{ 

    #region constructor 
    public ViewItemsViewModel(){} 
    #endregion 

    #region properties 


    private Double rightSpecGlassStrength; 
    public Double RightSpecGlassStrength 
    { 
     get 
     { 
      return rightSpecGlassStrength; 
     } 
     set 
     { 
      rightSpecGlassStrength=value; 
      ValidateStrengths("RightSpecGlassStrength", RightSpecGlassStrength); 
      PropertyChangedHandler("RightSpecGlassStrength"); 
     } 
    } 

    private void ValidateStrengths(string propertyName1, double RightSpecGlassStrength) 
    { 
     ClearErrorFromProperty(propertyName1); 
     if (RightSpecGlassStrength == 0) 
      AddErrorForProperty(propertyName1, "Value can not be 0"); 
    } 


    #endregion 
} 

EntityViewModel.cs正在實施INotifyDataErrorInfo接口和繼承ViewModelBase

public class EntityViewModel : ViewModelBase, INotifyDataErrorInfo 
    { 
     } 

ViewModelBase.cs實現當我將綁定文本框或其他Silverlight控件到視圖模型INotifyPropertyChanged的

public class ViewModelBase : INotifyPropertyChanged 
    { 
} 

我的代碼工作正常。 並在控件上顯示正確的驗證異常。

但是,當用戶控件獲取驗證異常時,控件不會顯示任何異常。

我不明白用戶控制有什麼問題。

+0

你是什麼意思'當用戶控制得到驗證異常'? –

回答

0

這是難以完全調試問題,而後面的代碼對用戶的控制,但是,在我看來,你對代碼依賴屬性的背後是這樣的:

public static DependencyProperty TextValueProperty = DependencyProperty.Register("TextValue", typeof(string), typeof(NumericUpDown1), null) 

然後你似乎使用TextInputStart,KeyDown,KeyUp事件來捕獲對基礎控件的更改。我的預感是: a)您無法將TextValue屬性更新爲新值。 b)您的代碼背後干擾驗證過程。

我會建議,而不是後面的代碼,你在xaml中命名用戶控件;即

<UserControl x:Class="NumericUpDown1" x:Name="View"> ... </UserControl> 

然後直接底層文本框的文本值綁定到依賴屬性,像這樣:

<TextBox Text="{Binding ElementName=View, Path=TextValue, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" ... /> 

這應該然後允許驗證機制以正常進行。

希望它有幫助。