Estou escrevendo um programa WPF e estou tentando descobrir uma maneira de formatar dados em um TextBox por meio de algum método repetível como um estilo ou modelo. Eu tenho muitos TextBoxes (95 para ser exato) e cada um está vinculado a seus próprios dados numéricos, cada um com sua própria resolução definida. Por exemplo, se os dados são 99,123 com uma resolução de 2, ele deve exibir 99,12. Da mesma forma, um valor de dados de 99 e resolução 3 deve ser exibido como 99.000 (não 99). Existe uma maneira de fazer isso?
Edit: Devo esclarecer, há 95 TextBoxes na tela atual em que estou trabalhando, mas quero que cada TextBox das várias telas do meu programa exiba o número correto de casas decimais. Agora que penso sobre isso, alguns deles são TextBoxes (como a tela em que estou trabalhando agora) e alguns são DataGrids ou ListViews, mas se eu conseguir descobrir como fazê-los funcionar para TextBoxes, tenho certeza que posso descobrir para os outros controles também.
Não há muito código para compartilhar neste caso, mas tentarei deixar isso mais claro:
Eu tenho um modelo de visualização que contém as seguintes propriedades (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
e no XAML eu tenho:
<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 (minha solução): Acontece que, depois de me afastar do computador por um tempo, voltei para encontrar uma resposta simples que estava me encarando. Formate os dados no modelo de visualização!
Public ReadOnly Property Value As String
Get
Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
End Get
End Property
fonte
IValueConverter
? Passe o valor real e a resolução para o conversor e deixe-o fazer o arredondamento para você dentro dele mesmo. É difícil sugerir umStringFormat
sem saber exatamente como esses 95TextBox
são gerados.Respostas:
Você deve usar o
StringFormat
noBinding
. Você pode usar formatos de string padrão ou formatos de string personalizados :<TextBox Text="{Binding Value, StringFormat=N2}" /> <TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />
Observe que
StringFormat
só funciona quando a propriedade target é do tipo string. Se você está tentando definir algo como umaContent
propriedade (typeof(object)
), você precisará usar um personalizadoStringFormatConverter
( como aqui ) e passar sua string de formato como oConverterParameter
.Editar para pergunta atualizada
Portanto, se você
ViewModel
define a precisão, recomendo fazer isso como umMultiBinding
e criar o seu próprioIMultiValueConverter
. Isso é muito chato na prática, ir de uma ligação simples para uma que precisa ser expandida para umMultiBinding
, mas se a precisão não for conhecida no tempo de compilação, isso é praticamente tudo que você pode fazer. VocêIMultiValueConverter
precisaria pegar o valor e a precisão e gerar a string formatada. Você seria capaz de fazer isso usandoString.Format
.No entanto, para coisas como um
ContentControl
, você pode fazer isso muito mais facilmente com umStyle
:<Style TargetType="{x:Type ContentControl}"> <Setter Property="ContentStringFormat" Value="{Binding Resolution, StringFormat=N{0}}" /> </Style>
Qualquer controle que exponha um
ContentStringFormat
pode ser usado dessa forma. Infelizmente,TextBox
não tem nada parecido.fonte
#,#.00
não compila - a vírgula é interpretada como um delimitador para atributos naBinding
extensão de marcação.StringFormat={}{0:#,#.00}
. Vou atualizar a resposta para funcionar corretamente.A resposta aceita não mostra 0 no lugar inteiro ao fornecer uma entrada como 0,299. Ele mostra 0,3 na IU do WPF. Então, minha sugestão de usar o seguinte formato de string
<TextBox Text="{Binding Value, StringFormat={}{0:#,0.0}}"
fonte
fonte