Programing

스타일 / 템플릿을 사용하여 wpf에서 소수점 이하 자릿수를 포맷하는 방법은 무엇입니까?

lottogame 2020. 10. 5. 07:29
반응형

스타일 / 템플릿을 사용하여 wpf에서 소수점 이하 자릿수를 포맷하는 방법은 무엇입니까?


WPF 프로그램을 작성 중이며 스타일이나 템플릿과 같은 반복 가능한 방법을 통해 TextBox의 데이터 서식을 지정하는 방법을 찾으려고합니다. 나는 많은 TextBoxes (정확히 95)를 가지고 있으며 각각은 자체 해상도를 정의 할 수있는 자체 숫자 데이터에 바인딩되어 있습니다. 예를 들어 데이터가 해상도가 2 인 99.123이면 99.12를 표시해야합니다. 마찬가지로 데이터 값 99 및 해상도 3은 99.000 (99가 아님)으로 표시되어야합니다. 이 작업을 수행하는 방법이 있습니까?

편집 : 작업중인 현재 화면에 95 개의 TextBox가 있지만 프로그램의 다양한 화면에있는 모든 TextBox가 올바른 소수 자릿수를 표시하기를 원합니다. 이제 생각 해보았으니이 중 일부는 (지금 작업중인 화면과 같은) TextBox이고 일부는 DataGrids 또는 ListView입니다.하지만 TextBox에서 작동하도록하는 방법을 알아낼 수 있다면 다른 컨트롤도 마찬가지입니다.

이 경우 공유 할 코드는 많지 않지만 더 명확하게 만들려고합니다.

다음 속성 (vb.net)이 포함 된보기 모델이 있습니다.

    Public ReadOnly Property Resolution As Integer
        Get
            Return _signal.DisplayResolution
        End Get
    End Property

    Public ReadOnly Property Value As Single
        Get
            Return Math.Round(_signal.DisplayValue, Resolution)
        End Get
    End Property

XAML에는 다음이 있습니다.

<UserControl.Resources>
    <vm:SignalViewModel x:Key="Signal" SignalPath="SomeSignal"/>
</UserControl.Resources>
<TextBox Grid.Column="3" IsEnabled="False" Text="{Binding Path=Value, Source={StaticResource Signal}, Mode=OneWay}" />

EDIT2 (내 솔루션) : 잠시 컴퓨터에서 멀어진 후 다시 돌아와서 나를 쳐다 보는 간단한 대답을 찾았습니다. 뷰 모델에서 데이터를 포맷하십시오!

    Public ReadOnly Property Value As String
        Get
            Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
        End Get
    End Property

에서를 사용해야 StringFormat합니다 Binding. 표준 문자열 형식 또는 사용자 지정 문자열 형식을 사용할 수 있습니다 .

<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />

점을 유의 StringFormat대상 속성이 String 형의 경우에만 작동합니다. Content속성 ( typeof(object)) 과 같은 것을 설정하려는 경우 사용자 정의 StringFormatConverter( 여기와 같은 ) 를 사용하고 형식 문자열을 ConverterParameter.

업데이트 된 질문 수정

따라서 ViewModel정밀도를 정의하는 경우이 작업을으로 수행하고 MultiBinding자신의 IMultiValueConverter. 이것은 실제로 간단한 바인딩에서으로 확장해야하는 바인딩으로 이동하는 데 매우 성가신 일입니다 MultiBinding.하지만 컴파일 타임에 정밀도를 알 수없는 경우이 작업을 수행 할 수 있습니다. 귀하는 IMultiValueConverter값 및 정밀도, 출력 포맷 된 문자열을해야합니다. 을 사용하여이 작업을 수행 할 수 있습니다 String.Format.

그러나 a와 같은 경우 ContentControl에는 다음을 사용하여 훨씬 더 쉽게 수행 할 수 있습니다 Style.

<Style TargetType="{x:Type ContentControl}">
    <Setter Property="ContentStringFormat" 
            Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>

a를 노출하는 모든 컨트롤은 ContentStringFormat이와 같이 사용할 수 있습니다. 불행히도 그런 TextBox것은 없습니다.


허용되는 답변은 0.299와 같은 입력을 제공 할 때 정수 자리에 0을 표시하지 않습니다. WPF UI에 .3이 표시됩니다. 그래서 다음 문자열 형식을 사용하는 것이 좋습니다.

<TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 

    void NumericTextBoxInput(object sender, TextCompositionEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        var regex = new Regex(@"^[0-9]*(?:\.[0-9]{0,1})?$");
        string str = txt.Text + e.Text.ToString();
        int cntPrc = 0;
        if (str.Contains('.'))
        {
            string[] tokens = str.Split('.');
            if (tokens.Count() > 0)
            {
                string result = tokens[1];
                char[] prc = result.ToCharArray();
                cntPrc = prc.Count();
            }
        }
        if (regex.IsMatch(e.Text) && !(e.Text == "." && ((TextBox)sender).Text.Contains(e.Text)) && (cntPrc < 3))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }

참고 URL : https://stackoverflow.com/questions/18361689/how-to-format-number-of-decimal-places-in-wpf-using-style-template

반응형