[Wpf] 유효성 검사를 사용하여 이중 필드에 바인딩



Answers

소문자로 값의 서식을 지정하려고 시도 했습니까?

이상하게 보일지 모르지만, 항상 소수점 이하 N 자리를 가질 것입니다.

<TextBox.Text>
    <Binding Path="DoubleField" StringFormat="{}{0:0.00}" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True"/>
</TextBox.Text>

고정 소수점 자리가 충분하지 않은 경우 값을 문자열로 처리하고이를 이중으로 변환하는 변환기를 작성해야 할 수 있습니다.

Question

UpdateSourceTrigger=PropertyChanged 하여 TextBox 를 일부 객체의 double 속성에 바인딩하려고합니다. 목표는 입력 된 값의 유효성을 허용 범위 내로 바로 편집하는 것입니다 (그렇지 않은 경우 오류를 표시합니다). IDataErrorInfo 를 통해 모델 레벨에서 유효성 검사를 구현하고 싶습니다.

모든 속성은 int 속성에 바인딩 할 때 좋지만 속성이 두 배이면 좌절하는 편집 동작이 나타납니다. 마지막 소수점 이하 자릿수를 지운 후에 - 소수점 구분 기호가 자동으로 지워집니다 (가능한 모든 소수점 이하 자릿수로). 예를 들어, 숫자 '12 .03 '에서 숫자'3 '을 지운 후에 텍스트는 '12 .0'대신 '12'로 변경됩니다.

도와주세요.

샘플 코드는 다음과 같습니다.

MainWindow.xaml :

<Window x:Class="BindWithValidation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="80" Width="200" WindowStartupLocation="CenterOwner">

  <StackPanel>
    <TextBox Width="100" Margin="10" Text="{Binding DoubleField, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
      <TextBox.Style>
        <Style TargetType="TextBox">
          <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
              <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
          </Style.Triggers>
        </Style>
      </TextBox.Style>
    </TextBox>
  </StackPanel>
</Window>

MainWindow.xaml.cs :

namespace BindWithValidation
{
  public partial class MainWindow : Window
  {
    private UISimpleData _uiData = new UISimpleData();

    public MainWindow()
    {
      InitializeComponent();
      DataContext = _uiData;
    }
  }
}

UISimpleData.cs :

namespace BindWithValidation
{
  public class UISimpleData : INotifyPropertyChanged, IDataErrorInfo
  {
    private double _doubleField = 12.03;

    public double DoubleField
    {
      get
      {
        return _doubleField;
      }
      set
      {
        if (_doubleField == value)
          return;

        _doubleField = value;
        RaisePropertyChanged("DoubleField");
      }
    }

    public string this[string propertyName]
    {
      get
      {
        string validationResult = null;
        switch (propertyName)
        {
          case "DoubleField":
          {
            if (DoubleField < 2 || DoubleField > 5)
              validationResult = "DoubleField is out of range";
            break;
          }

          default:
            throw new ApplicationException("Unknown Property being validated on UIData");
        }

        return validationResult;
      }
    }

    public string Error { get { return "not implemented"; } }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string property)
    {
      if ( PropertyChanged != null )
        PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    }
  }
}



문제는 값이 변경 될 때마다 속성을 업데이트한다는 것입니다. 12.03을 12.0으로 변경하면 12로 반올림됩니다.

xaml 에서 TextBox 를 변경하여 delay 을 제공함으로써 변경 사항을 확인할 수 있습니다.

<TextBox Width="100" Margin="10" Text="{Binding DoubleField, UpdateSourceTrigger=PropertyChanged,Delay=500, ValidatesOnDataErrors=True}">

delay 은 밀리 초 단위의 지연 시간 후에 속성을 통지하고 설정합니다. 이처럼 StringFormat 사용하는 것이 더 낫다.

<TextBox Width="100" Margin="10" Text="{Binding DoubleField, UpdateSourceTrigger=PropertyChanged,StringFormat=N2, ValidatesOnDataErrors=True}">



바인딩에서 StringFormat을 사용해보십시오.

<TextBox Width="100" Margin="10" Text="{Binding DoubleField, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, StringFormat='0.0'}"> 

문자열 형식이 맞는지 잘 모르겠지만 잠시 동안 한 번도 해본 적이 없지만 예제 일뿐입니다.