2014-01-28 49 views
0

我有控制權,被別人使用。它有一個綁定到十進制值的TexBox。由於精度可以變化,我使用DependencyProperty和MultiBinding來指定它。 當文本框沒有聚焦時,數字應該以指定的精度顯示,但聚焦時應顯示完整數字。當TextBox聚焦或不聚焦時顯示不同的十進制精度的最佳方式?

實施例:

  • 精度:2
  • 用戶輸入:29.333
  • 文本框不集中應該顯示:29.33
  • 文本框集中應顯示:29.333

我已經完成這通過使用IMultibindingConverter和IsFocused屬性。但我不知道這是否是最好的方法。

我TexBox這樣定義

<UserControl.Resources> 
     <conv:ValuePrecisionConverter x:Key="ValuePrecisionConverter" />   
    </UserControl.Resources> 
     <TextBox x:Name="myTextBox"> 
       <TextBox.Text> 
       <MultiBinding Converter="{StaticResource ValuePrecisionConverter}" Mode="TwoWay" 
    NotifyOnValidationError="true"> 
        <Binding ElementName="parent" UpdateSourceTrigger="PropertyChanged" Path="Value" Mode="TwoWay" /> 
        <Binding ElementName="parent" Path="Precision"/> 
        <Binding ElementName="parent" Path="AdditionalFormatting"/> 
        <Binding ElementName="myTextBox" Path="IsFocused" Mode="OneWay"/> 
        </MultiBinding> 
       </TextBox.Text>   
     </TextBox> 

ValuePrecisionConver的定義是這樣的:

public class ValuePrecisionConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      double? value = null; 
      converter = null; 

      value = System.Convert.ToDouble(values[0]); 
      precision = System.Convert.ToInt32(values[1]); 
      //Other code with 3rd parameter 

      if (values.Count() > 3) 
      { 
       bool isFocused = System.Convert.ToBoolean(values[3]); 

       if (isFocused) 
        return value.ToString(); 
      } 

      /*Here I do the formating with the given precision*/ 
      return formattedValue; 
     } 


} 

這是完成我需要最好的方法是什麼?可以使用這樣的IsFocused屬性嗎?

回答

0

試試這個。

<TextBox x:Name="myTextBox"> 
    <TextBox.Style> 
     <Style TargetType="TextBox"> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="False"> 
        <Setter Property="Text" Value="{Binding Value, StringFormat=n2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
       </Trigger> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="Text" Value="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 
+0

我值的格式有不同的精度,這取決於使用我的控制的人。此外,它可能會添加一些特殊的格式。我如何通過你的建議來完成這項工作? – Dzyann

+0

您可以使用動態值綁定StringFormat:StringFormat = {Binding ...}或StringFormat = {StaticResource ...}。更多信息http://msdn.microsoft.com/es-es/library/system.string.format(v=vs.110).aspx – PakKkO

+0

中的StringFormat刪除UpdateSourceTrigger以獲得良好的行爲! – PakKkO

0

我寧願你去事件觸發與PreviewGotKeyboardFocus和PreviewLostKeyboardFocus ......與轉換器設定值..無需MuiltBinding這裏的......

+0

我不確定我是否理解用轉換器設置值的含義。我的精度取決於我的DependencyProperty Precision的值。而且我還必須使用AdditionalFormatting(這是另一個依賴項屬性)應用一些自定義格式。如何做到這一點? – Dzyann