我有一段代码示例,假设从转换器设置矩形的宽度。我可以看到转换器被调用了两次(第二次使用所需的值),但该值似乎没有达到矩形的Width属性。
注意:我故意使用矩形而不是进度条-要求
这是xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:viewmodel="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<viewmodel:CalcWidthFromPercentageConverter x:Key="CalcWidthFromPercentageConverter" />
</Window.Resources>
<Window.DataContext>
<viewmodel:ViewModel/>
</Window.DataContext>
<Grid>
<Border x:Name="borderParent" Height="20" HorizontalAlignment="Stretch" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Center">
<Rectangle Fill="Red" Height="20" HorizontalAlignment="Left">
<Rectangle.Width>
<MultiBinding Converter="{StaticResource CalcWidthFromPercentageConverter}">
<Binding Path="ProgressWidthPercentage"/>
<Binding Path="ActualWidth" ElementName="borderParent"></Binding>
</MultiBinding>
</Rectangle.Width>
</Rectangle>
</Border>
</Grid>
这是转换器
public class CalcWidthFromPercentageConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Count() == 2)
{
decimal inputPercentage = (decimal)values[0];
decimal borderWidth = System.Convert.ToDecimal(values[1]);
decimal result = borderWidth * inputPercentage;
return result;
}
return values;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return new[] { value };
}
}
最后是视图模型
public class ViewModel
{
private readonly decimal _progressWidthPercentage;
public decimal ProgressWidthPercentage
{
get { return _progressWidthPercentage; }
}
public ViewModel()
{
_progressWidthPercentage = (decimal)0.37;
}
}
只是"JanW"注释的副本,它解决了这个问题:
"我建议你做两件事:宽度以Double度量。使用Double而不是Decimal。更重要的是:不要将"values"作为默认值返回,因为它不会传递有效的Double值,而是object[]。这会导致绑定失败"
我只需要将值绑定并在转换器中返回到双精度,而不是十进制。