我想在WPF窗口中显示一些double类型。应允许用户选择应显示的小数位数。
我想直接在视图(XAML)中解决这个问题,而不需要在代码后面格式化数字。我尝试使用 StringFormat 和 MultiBinding 显示具有选定小数位数的绑定数字:
MainWindow.xaml:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Width="400" Height="100">
<StackPanel Orientation="Horizontal" Height="30">
<TextBlock Margin="5" >Precision:</TextBlock>
<ComboBox x:Name="cbPrecision"
Margin="5"
MinWidth="80"
ItemsSource="{Binding Path=DecimalPlaces}"
DisplayMemberPath="Value"
SelectedValuePath="Key"/>
<TextBlock Margin="5" >
<TextBlock.Text>
<MultiBinding StringFormat="Number: {0:N{1}}">
<Binding Path="SomeNumber"/>
<Binding Path="SelectedValue" ElementName="cbPrecision"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
MainWindow.xaml.cs:
using System.Collections.Generic;
using System.Windows;
namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public Dictionary<int, double> DecimalPlaces { get; } = new() {
{ 0, 1 },
{ 1, 0.1 },
{ 2, 0.01 },
{ 3, 0.001 }
};
public double SomeNumber { get; set; } = 123.45678;
}
}
因此根本不显示TextBox:
预期结果:
观察:
“嵌套”字符串格式一定有问题
<MultiBinding StringFormat="Number: {0:N{1}}">
因为将包含StringFormat的代码行更改为
<MultiBinding StringFormat="Number: {0:N4}-DecimalPlaces: {1}">
正确显示文本框中的值:
2条答案
按热度按时间eqqqjvef1#
首先,将
TextBlock
替换为Label
,它具有用于绑定的ContentStringFormat
属性。然后,定义一个实现
INotifyPropertyChanged
接口的类。具体实现如下:
我尝试将
comboBox1.SelectedValue
绑定到ContentStringFormat
,但不起作用。因此,我使用了
INotifyPropertyChanged
接口,并在ContentFormat
更改时触发了SomeNumber
Changed 通知。fdx2calv2#
根据克莱门斯的评论,我创建了一个转换器。完整的解决方案: