WPF 프로그램을 작성 중이며 스타일이나 템플릿과 같은 반복 가능한 방법을 통해 TextBox의 데이터 서식을 지정하는 방법을 찾으려고합니다. 나는 많은 TextBoxes (정확히 95)를 가지고 있으며 각각은 자체 해상도를 정의 할 수있는 자체 숫자 데이터에 바인딩되어 있습니다. 예를 들어 데이터가 해상도가 2 인 99.123이면 99.12를 표시해야합니다. 마찬가지로 데이터 값 99와 해상도 3은 99.000 (99가 아님)으로 표시되어야합니다. 이를 수행하는 방법이 있습니까?
편집 :
작업중인 현재 화면에 95 개의 TextBox가 있지만 프로그램의 다양한 화면에있는 모든 TextBox가 올바른 소수 자릿수를 표시하기를 원합니다. 이제 생각해 보면이 중 일부는 TextBox (예 : 지금 작업중인 화면)이고 일부는 DataGrids 또는 ListViews이지만 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;
}
}