集合 属性 ConverterParameter 为空
Collection property ConverterParameter is null
我在 wpf 中遇到了奇怪的行为。每当我尝试将 x:Array
作为转换器参数传递给我的转换器时,我都会收到此错误。设计器视图显示错误而不是我的控件。
只有当我在 Style
:
中执行此操作时才会发生此错误
property 'System.Windows.Data.Binding'.'ConverterParameter' is null.
虽然我的程序编译成功运行没有任何问题,但在设计视图中它真的很烦人,因为我看不到我的控件,我希望你能找到这个问题的原因并给出解决方案。
我已经简化了我所拥有的,下面是重现此问题的方法(所以这只是示例,并不完全是我所拥有的)。
您只需执行以下步骤即可重现此问题:
第 1 步: 使用此内容创建用户控件。 (ContentControl 只是示例。任何具有模板 属性 的控件都会发生这种情况。)
<UserControl.Resources> <!-- will tell you in next step --> </UserControl.Resources>
<Grid>
<ContentControl Style="{StaticResource MyStyle}"></ContentControl>
</Grid>
第 2 步: 现在您必须在您的 UserControl 资源(或您喜欢的任何全局资源)中创建 MyStyle
。
<UserControl.Resources>
<Style x:Key="MyStyle" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Border Background="Black" Width="16" Height="16">
<!-- if I remove these error will be gone -->
<Border.Resources>
<converters:ThicknessConverter x:Key="ThicknessConverter"/>
<x:Array x:Key="ThicknessModifier" Type="Thickness">
<!--Thickness Coefficient-->
<Thickness>-0.5</Thickness>
<!--Thickness Offset-->
<Thickness>0,2</Thickness>
</x:Array>
</Border.Resources>
<Border.Margin>
<Binding Path="Width"
RelativeSource="{RelativeSource Self}"
Converter="{StaticResource ThicknessConverter}"
ConverterParameter="{StaticResource ThicknessModifier}"/>
</Border.Margin>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
Step3: 创建转换器,我没有测试过,但我认为这会发生在任何转换器上。因为我的转换器没有抛出异常。
/// <summary>
/// returns thickness and sets given value to uniform length,
/// array of thickness with length of two can be passed as parameter,
/// first element of parameter is used for thickness multiplication and second element is used for addition.
/// note that multiplication has higher priority.
/// </summary>
[ValueConversion(typeof(double), typeof(Thickness), ParameterType = typeof(Thickness[]))]
public sealed class ThicknessConverter : IValueConverter
{
[NotNull]
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
{
var val = (double)value;
var param = parameter as Thickness[];
if (param?.Length >= 1)
{
if (param.Length >= 2)
{
return new Thickness(
val*param[0].Left + param[1].Left,
val*param[0].Top + param[1].Top,
val*param[0].Right + param[1].Right,
val*param[0].Bottom + param[1].Bottom);
}
else
{
return new Thickness(
val*param[0].Left,
val*param[0].Top,
val*param[0].Right,
val*param[0].Bottom);
}
}
else
{
if (parameter is Thickness)
{
var mul = (Thickness)parameter;
return new Thickness(
val*mul.Left,
val*mul.Top,
val*mul.Right,
val*mul.Bottom);
}
return new Thickness(val);
}
}
else return default(Thickness);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
第 4 步: 将用户控件放在主 window 中。和 运行 程序。我希望你能看到错误。我确实在我的电脑上复制了这个,所以我认为你也应该得到它。我该如何解决这个问题?
我可以通过使用 Collection<Thickness>
而不是 x:Array
来解决这个问题,我仍然不知道为什么 x:Array
有这个奇怪的问题。所以我为厚度列表创建了一个包装器 class。
public class ThicknessList : Collection<Thickness>
{
}
另外一件事是我必须把这个厚度列表资源放在样式的资源容器中,如果我把它放在边框的资源容器中我会得到这个奇怪的错误
Missing key value on object
顺便说一句,这里是对样式的修复。 (转换器也需要一些改变,因为传递的参数不再是数组,但这在这里并不重要。)
<Style x:Key="MyStyle" TargetType="ContentControl">
<Style.Resources> <!-- must put resource here -->
<converters:ThicknessConverter x:Key="ThicknessConverter"/>
<ns:ThicknessList x:Key="ThicknessModifier"> <!-- wrapper list instead of x:Array -->
<!--Thickness Coefficient-->
<Thickness>-0.5</Thickness>
<!--Thickness Offset-->
<Thickness>0,2</Thickness>
</ns:ThicknessList>
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Border Background="Black" Width="16" Height="16">
<Border.Margin>
<Binding Path="Width"
RelativeSource="{RelativeSource Self}"
Converter="{StaticResource ThicknessConverter}"
ConverterParameter="{StaticResource ThicknessModifier}"/>
</Border.Margin>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我在 wpf 中遇到了奇怪的行为。每当我尝试将 x:Array
作为转换器参数传递给我的转换器时,我都会收到此错误。设计器视图显示错误而不是我的控件。
只有当我在 Style
:
property 'System.Windows.Data.Binding'.'ConverterParameter' is null.
虽然我的程序编译成功运行没有任何问题,但在设计视图中它真的很烦人,因为我看不到我的控件,我希望你能找到这个问题的原因并给出解决方案。
我已经简化了我所拥有的,下面是重现此问题的方法(所以这只是示例,并不完全是我所拥有的)。
您只需执行以下步骤即可重现此问题:
第 1 步: 使用此内容创建用户控件。 (ContentControl 只是示例。任何具有模板 属性 的控件都会发生这种情况。)
<UserControl.Resources> <!-- will tell you in next step --> </UserControl.Resources>
<Grid>
<ContentControl Style="{StaticResource MyStyle}"></ContentControl>
</Grid>
第 2 步: 现在您必须在您的 UserControl 资源(或您喜欢的任何全局资源)中创建 MyStyle
。
<UserControl.Resources>
<Style x:Key="MyStyle" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Border Background="Black" Width="16" Height="16">
<!-- if I remove these error will be gone -->
<Border.Resources>
<converters:ThicknessConverter x:Key="ThicknessConverter"/>
<x:Array x:Key="ThicknessModifier" Type="Thickness">
<!--Thickness Coefficient-->
<Thickness>-0.5</Thickness>
<!--Thickness Offset-->
<Thickness>0,2</Thickness>
</x:Array>
</Border.Resources>
<Border.Margin>
<Binding Path="Width"
RelativeSource="{RelativeSource Self}"
Converter="{StaticResource ThicknessConverter}"
ConverterParameter="{StaticResource ThicknessModifier}"/>
</Border.Margin>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
Step3: 创建转换器,我没有测试过,但我认为这会发生在任何转换器上。因为我的转换器没有抛出异常。
/// <summary>
/// returns thickness and sets given value to uniform length,
/// array of thickness with length of two can be passed as parameter,
/// first element of parameter is used for thickness multiplication and second element is used for addition.
/// note that multiplication has higher priority.
/// </summary>
[ValueConversion(typeof(double), typeof(Thickness), ParameterType = typeof(Thickness[]))]
public sealed class ThicknessConverter : IValueConverter
{
[NotNull]
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
{
var val = (double)value;
var param = parameter as Thickness[];
if (param?.Length >= 1)
{
if (param.Length >= 2)
{
return new Thickness(
val*param[0].Left + param[1].Left,
val*param[0].Top + param[1].Top,
val*param[0].Right + param[1].Right,
val*param[0].Bottom + param[1].Bottom);
}
else
{
return new Thickness(
val*param[0].Left,
val*param[0].Top,
val*param[0].Right,
val*param[0].Bottom);
}
}
else
{
if (parameter is Thickness)
{
var mul = (Thickness)parameter;
return new Thickness(
val*mul.Left,
val*mul.Top,
val*mul.Right,
val*mul.Bottom);
}
return new Thickness(val);
}
}
else return default(Thickness);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
第 4 步: 将用户控件放在主 window 中。和 运行 程序。我希望你能看到错误。我确实在我的电脑上复制了这个,所以我认为你也应该得到它。我该如何解决这个问题?
我可以通过使用 Collection<Thickness>
而不是 x:Array
来解决这个问题,我仍然不知道为什么 x:Array
有这个奇怪的问题。所以我为厚度列表创建了一个包装器 class。
public class ThicknessList : Collection<Thickness>
{
}
另外一件事是我必须把这个厚度列表资源放在样式的资源容器中,如果我把它放在边框的资源容器中我会得到这个奇怪的错误
Missing key value on object
顺便说一句,这里是对样式的修复。 (转换器也需要一些改变,因为传递的参数不再是数组,但这在这里并不重要。)
<Style x:Key="MyStyle" TargetType="ContentControl">
<Style.Resources> <!-- must put resource here -->
<converters:ThicknessConverter x:Key="ThicknessConverter"/>
<ns:ThicknessList x:Key="ThicknessModifier"> <!-- wrapper list instead of x:Array -->
<!--Thickness Coefficient-->
<Thickness>-0.5</Thickness>
<!--Thickness Offset-->
<Thickness>0,2</Thickness>
</ns:ThicknessList>
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Border Background="Black" Width="16" Height="16">
<Border.Margin>
<Binding Path="Width"
RelativeSource="{RelativeSource Self}"
Converter="{StaticResource ThicknessConverter}"
ConverterParameter="{StaticResource ThicknessModifier}"/>
</Border.Margin>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>