2014-01-28 1 views
0

다른 사람들이 사용하는 컨트롤이 있습니다. 10 진수 값에 바인딩되는 TexBox가 ​​있습니다. Precision은 다양 할 수 있기 때문에 DependencyProperty 및 MultiBinding을 사용하여 지정합니다. TextBox에 포커스가 설정되지 않은 경우 숫자는 지정된 정밀도로 표시되어야하지만 포커스가 설정되면 전체 숫자가 표시되어야합니다.TextBox의 포커스가 맞았는지 여부와 다른 Decimal Precision을 표시하는 가장 좋은 방법은 무엇입니까?

예 :

  • 정밀 : 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

여기 MuiltBinding의 필요가 없습니다 ... , 그것은 내 컨트롤을 사용하는 사람에 따라 다릅니다. 또한 특수 형식이 추가 될 수도 있습니다. 당신의 제안으로 그것을 어떻게 성취합니까? – Dzyann

+0

StringFormat을 동적 값으로 바인딩 할 수 있습니다. StringFormat = {Binding ...} 또는 StringFormat = {StaticResource ...}. 더 많은 정보 StringFormat http://msdn.microsoft.com/es-es/library/system.string.format(v=vs.110).aspx – PakKkO

+0

좋은 행동에 대한 UpdateSourceTrigger를 제거하십시오 !!! – PakKkO

0

나는 ... PreviewGotKeyboardFocus와 PreviewLostKeyboardFocus와 이벤트 트리거 갈 컨버터로 값을 설정하는 방법을 선호 할 것입니다 .. 내 값의 형식이 서로 다른 정밀도를 가지고

+0

변환기로 값을 설정하는 것이 무엇을 의미하는지 알지 못합니다. 내 정확성은 내 DependencyProperty Precision의 Value에 따라 다릅니다. 또한 SomeFormatting (다른 종속성 속성)을 사용하여 사용자 지정 서식을 적용해야합니다. 그것을 어떻게 성취 할 것인가? – Dzyann

관련 문제