2012-05-30 62 views
4

裏面一個文本框我有一個自定義的控制,這裏面我有一個文本框。我想應用一些包含傳遞參數的自定義驗證規則(例如,實現範圍檢查)。WPF應用驗證規則自定義用戶控制

我想驗證規則適用於頂級自定義控件像這樣。我盡我所能去掉多餘的代碼來使我的例子更一般,但如果我沒有完全成功,請耐心等待。我在論壇上發佈代碼的想法有點新。

<ns_control:CustomControl PropertyName="Value from embedded textBox:" 
    Style="{StaticResource errorInTextBox}"> 
     <ns_control:CustomControl.PropertyValue> 
      <Binding Path="PathX" 
        Mode="TwoWay"> 
            <Binding.ValidationRules> 
             <validation:IntegerInputRule Max="100" /> 
            </Binding.ValidationRules> 
      </Binding> 
     </ns_control:CustomControl.PropertyValue> 
</ns_control:CustomControl> 

好的,這就是爲了調用控件。我的實際代碼有一些與Validation.ErrorTemplate一起被設置爲執行某些操作的東西,但對於此示例來說這似乎是多餘的。 Style,errorInTextBox是問題核心,因爲它設定了我的自定義控件內部的texbox如何在驗證規則失敗時採取行動。到目前爲止,我已經能夠找到如何做到這一點的最佳方式是使用Style.Resources將我想要的樣式應用於位於自定義控件中的任何文本框。

 <Style x:Key="errorInTextBox" 
      TargetType="Control"> 
     <Style.Resources> 
      <Style TargetType="{x:Type TextBox}"> 
       <Style.Triggers> 
        <Trigger Property="Validation.HasError" 
          Value="true"> 
         <Setter Property="ToolTip" 
           Value="{Binding RelativeSource={RelativeSource Self}, 
           Path=(Validation.Errors)[0].ErrorContent}" /> 
         <Setter Property="BorderBrush" 
           Value="Green" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Style.Resources> 
    </Style> 

如果發現錯誤,或者至少,這就是我想做的事情上面做了提示,並更改文本框的邊框。我的主要問題是Style.Trigger - 這是我的失敗點。我希望在Validation.HasError爲true時觸發器成爲。問題是由於驗證規則是針對自定義控件設置的,而不是針對其內部的文本框設置的,因此文本框似乎並不知道HasError的實際值是什麼。我試着用Validation.ErrorTemplate修改borderbrush性等,但模板似乎並沒有訪問該文本框的屬性Style.Resource我上面使用的不和,因此它不能改變周圍的文本框的邊框的方法,等

有沒有解決這個辦法,或者我應該乾脆放棄封裝的想法,只要我使用這種方式自定義控件從頭剛剛定義的文本框中直接和我需要驗證?在那裏定義它們會讓我能夠訪問文本框的屬性,但是它會導致很多重複的XAML,並且看起來比我想要的方式更加優雅。

感謝任何和所有你的眼球,你的意見。

問候, 維克

回答

0

從這個問題我不知道,如果你可以容忍的控制,而不是文本框被設置驗證規則。

如果您可以在控件上設置規則,則在其ControlTemplate中爲文本框命名(我將假設爲x:Name="TextHolder")。在ControlTemplate.Triggers添加:

<Trigger Property="Validation.HasError" 
     Value="True"> 
    <Setter TargetName="TextHolder" 
      Property="ToolTip" 
      Value="{Binding RelativeSource={RelativeSource Self}, 
      Path=(Validation.Errors)[0].ErrorContent}" /> 
    <Setter TargetName="TextHolder" 
      Property="BorderBrush" 
      Value="Green" /> 
</Trigger> 

這將檢查在控制驗證,如果失敗的制定者將訪問文本框的屬性。


如果你必須有規則要在文本框中設置 -

  • ValidationRule類型的依賴屬性添加到控制。
  • 獲得(來自OnApplyTemplate覆蓋內Template.FindName),從模板的文本框中。
  • 獲取文本框的Text屬性的綁定(有點棘手,現在不記得語法)。
  • 將以上屬性的驗證規則添加到綁定中。
+0

謝謝您的洞察和答覆。我沒有任何特別的設計方面反對爲控件設置驗證規則,但我不確定如何讓綁定正常工作,因爲沒有真正的數據要綁定到控件的頂層。另外,我不確定自定義控件的控件模板如何用於命名文本框。我不需要將控件內部的文本框的所有特徵從控件xaml文件移動到控件模板中以便正常工作?再次感謝。 – user1426194