2012-08-22 7 views
1

Silverlight에서 바인딩을 사용하고 있습니다. TextBox를 Decimal 엔터티로 바인딩했습니다. 다음은 바인딩의 코드 스 니펫입니다.Silverlight의 Decimal Converter가 Lost Focus에서 올바르게 작동하지 않습니다.

 
<TextBox x:Name="AmountBox" Text="{Binding SelectedEntity.Amount,Mode=TwoWay,StringFormat=\{0:n2\},Converter={StaticResource DecimalBlankValueConverter}}" Validate="True" TextChanged="AmountBox_TextChanged" LostFocus="AmountBox_LostFocus"/>

아래 코드는 변환기 코드입니다. 손실 초점

decimal result; 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    {    
     if (!Decimal.TryParse(value.ToString(),out result) || (decimal)value == decimal.Zero) 
      return null; 
     return decimal.Parse(value.ToString()); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null || !Decimal.TryParse(value.ToString(), out result)) 
      return 0.00; 
     return decimal.Parse(value.ToString()); 
    } 

나는 GetBindingExpression (TextBox.TextProperty) .UpdateSource()와 소스 를 업데이트하고;

모든 것이 잘 처리되지만 초점이 손실되면 convert가 호출되지 않고 텍스트 상자에 문자열을 입력 할 때 convert가 호출되지 않고 textBox 텍스트가 비어있게 변환되지 않습니다.

누구든지 제게 제안 해주십시오. 코드에있는 문제는 무엇입니까? 사전에

감사합니다. ---- 주권

답변

0

TwoWayTextChangedLostFocus 이벤트 바인딩은 확실히 최선의 방법은 아닙니다. 바인딩이 기본적으로 수행하는 경우 을 LostFocus에 수신하는 이유는 무엇입니까? Y 인딩을 수동으로 갱신하려면 UpdateSourceTrigger=Explicit을 설정하십시오.

어쨌든 귀하의 변환기는 괜찮은 것 같지만, 필요하지 않다고 생각합니다. 내가 이해한다면, 10 진수로 변환 할 수없는 텍스트를 지우고 싶습니다.이 경우 숫자 만 허용하는 사용자 설정 TextBox을 만드는 것과 같은 몇 가지 옵션이 있거나 컨트롤을 Silverlight Toolkit에서 확인할 수 있습니다. 또한 비슷한 질문을 발견했습니다 here. 당신은 (하지 않으면, 당신은 Microsoft Expression Blend Software Development Kit에서 BlendSLSDK_en.msi을 다운로드 할 수 있습니다) Microsoft Expression Blend를 설치 한 경우

, 프로젝트에 System.Windows.Interactivity DLL을 추가하고 만드는 간단한 Behavior을 다음과 같이 :

public class TextBoxClearTextBehavior : System.Windows.Interactivity.Behavior<System.Windows.Controls.TextBox> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.LostFocus += AssociatedObjectLostFocus; 
     base.OnAttached(); 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.LostFocus -= AssociatedObjectLostFocus; 
     base.OnDetaching(); 
    } 

    private void AssociatedObjectLostFocus(object sender, System.Windows.RoutedEventArgs e) 
    { 
     decimal result; 
     if (!decimal.TryParse(AssociatedObject.Text, out result)) 
      AssociatedObject.Text = string.Empty; 
    } 
} 

처럼 사용
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

...  

<TextBox Text="{Binding Amount, Mode=TwoWay, StringFormat=\{0:n2\}}"> 
    <i:Interaction.Behaviors> 
     <Behavior:TextBoxClearTextBehavior/> 
    </i:Interaction.Behaviors> 
</TextBox> 
+0

고마워 ... \t 나는 TextBox에 문자열을 입력 할 때 Bindings가 예외를 제공한다고 생각하는데, Decimal Value에 바인딩합니다. 따라서 변환기는 호출되지 않습니다. –

+0

@ user1173233, 예외가 없어야합니다. 출력 창에서이를 확인할 수 있습니다. 'ConvertBack' 메쏘드는'TextBox'에 값을 입력 한 후에 호출되고 Decimal을 반환합니다. – Zabavsky

+0

고마워요. 내가 옳다고 생각하지만, 왜 변환이 불려지는지 모르겠다. –

0

당신의 설명에 따라 경찰, "변환 손실 초점 호출되지 않습니다 내가 텍스트 상자에 문자열을 입력하고 때, 변환이 전화를하지 않는 것보다 빈에 텍스트 상자의 텍스트를 변환하지 않습니다."

여기서 Convert 메서드는 TextBox의 Text 속성을 사용한 바인딩이 변경 될 때만 호출됩니다. 바인딩에 대해 Mode = TwoWay를 언급 했으므로 텍스트 상자에 텍스트를 입력하면 ConvertBack 메서드이 호출되고이 메서드에서 반환 된 값이 Source에 할당됩니다.이 경우 Source는 SelectedEntity입니다. 양.

왜 GetBindingExpression (TextBox.TextProperty) .UpdateSource();를 명시 적으로 작성해야하는지 이해할 수 없습니다. 코드를 잃어 버려 소스를 업데이트하십시오.

바인딩 모드를 두 가지 방법으로 유지 했으므로 변환기의 ConvertBack 메서드를 호출 한 후 소스를 업데이트해야합니다. 변환기 코드는 나에게 좋아 보인다.

자세한 내용이 필요하거나 오해를 불러 일으킬 수있는 점이 있으면 알려주십시오.

+0

나는 TextBox에 문자열을 입력 할 때 Bindings가 예외를 제공한다고 생각하는데, Decimal Value에 바인딩하고 있기 때문입니다. 따라서 변환기는 호출되지 않습니다. –

0

당신은 다음과 같이 TextChanged 이벤트에 바인딩을 수동으로 업데이트하는 경우 :

GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

어쩌면 당신은 LostFocus 이벤트 드릴 것입니다 값이 TextChanged 이벤트에 업데이트하는 것과 다른되지 않습니다!

그래서 바인딩의 값이 변경되지 않았기 때문에 변환기가 호출되지 않을 것입니다.

희망이 도움이됩니다.

+0

Bindings가 TextBox에 문자열을 입력 할 때 예외가 발생한다고 생각합니다. 그 값을 Decimal Value에 바인딩합니다. 따라서 변환기는 호출되지 않습니다. –