C# 集合属性ConverterParameter为空

C# 集合属性ConverterParameter为空,c#,wpf,styles,ivalueconverter,C#,Wpf,Styles,Ivalueconverter,我在wpf中遇到过奇怪的行为。当我试图将x:Array作为转换器参数传递给转换器时,我会遇到此错误。设计器视图显示错误,而不是我的控件 此错误仅在我以样式执行此操作时发生: 属性“System.Windows.Data.Binding”。“ConverterParameter”为空 虽然我的程序编译和运行成功,没有任何问题,但在设计视图中它真的很烦人,因为我看不到我的控件,我希望你能找到这个问题的原因并给出解决方案 我已经简化了我所拥有的,下面是重现这个问题的方法(所以这只是个例子,不是我所拥有

我在wpf中遇到过奇怪的行为。当我试图将
x:Array
作为转换器参数传递给转换器时,我会遇到此错误。设计器视图显示错误,而不是我的控件

此错误仅在我以
样式执行此操作时发生:

属性“System.Windows.Data.Binding”。“ConverterParameter”为空

虽然我的程序编译和运行成功,没有任何问题,但在设计视图中它真的很烦人,因为我看不到我的控件,我希望你能找到这个问题的原因并给出解决方案

我已经简化了我所拥有的,下面是重现这个问题的方法(所以这只是个例子,不是我所拥有的)

只需执行以下步骤即可重现此问题:

步骤1:使用此内容创建用户控件。(ContentControl只是一个例子。任何具有模板属性的控件都会发生这种情况。)

第3步:创建转换器,我还没有测试过,但我认为这会发生在任何转换器上。因为我的转换器不会抛出异常

/// <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();
    }
}
//
///返回厚度并将给定值设置为均匀长度,
///长度为2的厚度数组可以作为参数传递,
///参数的第一个元素用于厚度乘法,第二个元素用于加法。
///请注意,乘法具有更高的优先级。
/// 
[ValueConversion(typeof(double)、typeof(Thickness)、ParameterType=typeof(Thickness[])]
公共密封等级厚度转换器:IValueConverter
{
[非空]
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值为双精度)
{
var val=(双)值;
var param=参数作为厚度[];
如果(参数?.Length>=1)
{
如果(参数长度>=2)
{
返回新厚度(
val*param[0]。左+参数[1]。左,
val*param[0]。Top+param[1]。Top,
val*param[0]。右+参数[1]。右,
val*param[0]。底部+参数[1]。底部);
}
其他的
{
返回新厚度(
val*param[0]。左,
val*param[0]。顶部,
val*param[0]。对,
val*param[0]。底部);
}
}
其他的
{
if(参数为厚度)
{
var mul=(厚度)参数;
返回新厚度(
瓦尔*穆尔左,
瓦尔*穆尔托普,
瓦尔*穆尔对,
瓦尔*多个底部);
}
返回新厚度(val);
}
}
否则返回默认值(厚度);
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}

步骤4:将用户控件放在主窗口中。然后运行程序。我希望你能看到错误。我确实在我的电脑里复制了这个,所以我想你也应该得到它。我如何解决这个问题?

我可以通过使用
集合来解决这个问题,而不是
x:Array
,我仍然不知道
x:Array
为什么会有这个奇怪的问题。所以我为厚度列表创建了一个包装器类

public class ThicknessList : Collection<Thickness>
{
}
公共类厚度列表:集合
{
}
另一件事是,我必须把这个厚度列表资源放在样式的资源容器中,如果我把它放在边框的资源容器中,我会得到这个奇怪的错误

对象上缺少键值

顺便说一句,这里是修复的风格。(转换器也需要一些更改,因为传递的参数不再是数组,但这在这里并不重要。)


-0.5
0,2

你看过这个Q吗?还有一些答案可能会给你一个提示。@Tatranskymedved是的。我看到了。它不起作用。有趣的是,如果我关闭designer视图并运行我的程序,错误就会消失。。。但一旦我打开designer视图,就会出现错误,有什么想法吗(在designer中,正在为designer上下文(默认名称空间以
d:
开头)编译解决方案。我遇到了相同的问题(我想每个1都会遇到),但我还没有检查任何解决方案。感谢您的时间,我可以使用自定义列表而不是
x:Array
@TatranskymedvedHi来修复此问题。您可以介绍如何使用usercontrol吗?
/// <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();
    }
}
public class ThicknessList : Collection<Thickness>
{
}
<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>