WPF Multibind 转换器没有返回值?
WPF Multibind converter not returning value?
我有一个 multibind 调用带有两个绑定的转换器。出于某种原因,它没有 return 任何东西。我放
<ItemsControl.Width>
<MultiBinding Converter="{StaticResource ResourceKey=TimelineWidthConverter}">
<Binding Path="AnimationManager.MaxFrame" ElementName="UC" />
<Binding Path="AnimationManager.CurrentZoom" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:TimelineAnimationView}}" />
</MultiBinding>
</ItemsControl.Width>
在 XAML 文件中,转换器读取:
internal class MaterialTimelineWidthConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values == null || values.Length != 2 || ReferenceEquals(values[0], DependencyProperty.UnsetValue) || ReferenceEquals(values[1], DependencyProperty.UnsetValue))
{
return 240;
}
var maxFrame = System.Convert.ToInt32(values[0]);
var currentZoom = System.Convert.ToInt32(values[1]);
return currentZoom*maxFrame;
}
public object[] ConvertBack(object values, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
奇怪的是,如果我将 XAML 文件更改为:
<ItemsControl.Width>
280
</ItemsControl.Width>
它可以工作,但如果我只是在转换器中 return 280,它就不会做任何事情。就好像它只是 return 什么都没有,但它没有给出任何错误。
转换器以前工作,当时它只是一个单值转换器(传统绑定,没有多绑定),但是一旦我添加了第二个 属性 并使其成为多值转换器,它就不起作用了。有什么建议吗?
由多值转换器编辑的值 return 必须与目标 属性 的类型完全匹配。因此它必须是 return 和 double
值,而不是 int
.
您还必须对两个输入值进行正确的转换。您当前的代码假定 AnimationManager class 的 MaxFrame
和 CurrentZoom
属性都是 int
类型。如果它们实际上是 double
,请适当更改转换。
public object Convert(
object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length != 2 ||
ReferenceEquals(values[0], DependencyProperty.UnsetValue) ||
ReferenceEquals(values[1], DependencyProperty.UnsetValue))
{
return 240d;
}
var maxFrame = System.Convert.ToInt32(values[0]); // or ToDouble
var currentZoom = System.Convert.ToInt32(values[1]); // or ToDouble
return (double)(currentZoom * maxFrame);
}
一个可能更好的实现可能会检查输入值实际上是整数还是双精度(因此也消除了对 UnsetValue
的检查):
public object Convert(
object[] values, Type targetType, object parameter, CultureInfo culture)
{
double result = 240d;
if (values != null && values.Length == 2 &&
values[0] is int && values[1] is int)
{
var maxFrame = (int)values[0];
var currentZoom = (int)values[1];
result = (double)(currentZoom * maxFrame);
}
return result;
}
您正在尝试将 double
转换为 int
。
...
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length != 2 || values.Any(v => DependencyProperty.UnsetValue.Equals(v)))
return 240d;
return values.Cast<double>().Aggregate((v1, v2) => v1 * v2);
}
...
我有一个 multibind 调用带有两个绑定的转换器。出于某种原因,它没有 return 任何东西。我放
<ItemsControl.Width>
<MultiBinding Converter="{StaticResource ResourceKey=TimelineWidthConverter}">
<Binding Path="AnimationManager.MaxFrame" ElementName="UC" />
<Binding Path="AnimationManager.CurrentZoom" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:TimelineAnimationView}}" />
</MultiBinding>
</ItemsControl.Width>
在 XAML 文件中,转换器读取:
internal class MaterialTimelineWidthConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values == null || values.Length != 2 || ReferenceEquals(values[0], DependencyProperty.UnsetValue) || ReferenceEquals(values[1], DependencyProperty.UnsetValue))
{
return 240;
}
var maxFrame = System.Convert.ToInt32(values[0]);
var currentZoom = System.Convert.ToInt32(values[1]);
return currentZoom*maxFrame;
}
public object[] ConvertBack(object values, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
奇怪的是,如果我将 XAML 文件更改为:
<ItemsControl.Width>
280
</ItemsControl.Width>
它可以工作,但如果我只是在转换器中 return 280,它就不会做任何事情。就好像它只是 return 什么都没有,但它没有给出任何错误。
转换器以前工作,当时它只是一个单值转换器(传统绑定,没有多绑定),但是一旦我添加了第二个 属性 并使其成为多值转换器,它就不起作用了。有什么建议吗?
由多值转换器编辑的值 return 必须与目标 属性 的类型完全匹配。因此它必须是 return 和 double
值,而不是 int
.
您还必须对两个输入值进行正确的转换。您当前的代码假定 AnimationManager class 的 MaxFrame
和 CurrentZoom
属性都是 int
类型。如果它们实际上是 double
,请适当更改转换。
public object Convert(
object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length != 2 ||
ReferenceEquals(values[0], DependencyProperty.UnsetValue) ||
ReferenceEquals(values[1], DependencyProperty.UnsetValue))
{
return 240d;
}
var maxFrame = System.Convert.ToInt32(values[0]); // or ToDouble
var currentZoom = System.Convert.ToInt32(values[1]); // or ToDouble
return (double)(currentZoom * maxFrame);
}
一个可能更好的实现可能会检查输入值实际上是整数还是双精度(因此也消除了对 UnsetValue
的检查):
public object Convert(
object[] values, Type targetType, object parameter, CultureInfo culture)
{
double result = 240d;
if (values != null && values.Length == 2 &&
values[0] is int && values[1] is int)
{
var maxFrame = (int)values[0];
var currentZoom = (int)values[1];
result = (double)(currentZoom * maxFrame);
}
return result;
}
您正在尝试将 double
转换为 int
。
...
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length != 2 || values.Any(v => DependencyProperty.UnsetValue.Equals(v)))
return 240d;
return values.Cast<double>().Aggregate((v1, v2) => v1 * v2);
}
...