【问题标题】:Collection property ConverterParameter is null集合属性 ConverterParameter 为 null
【发布时间】:2017-01-29 14:32:30
【问题描述】:

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

只有当我在Style 中执行此操作时才会发生此错误:

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

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

我已经简化了我所拥有的,以下是重现此问题的方法(所以这只是示例,不完全是我所拥有的)。

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

第 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>

第 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();
    }
}

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

【问题讨论】:

  • 你看过这个Q吗? stackoverflow.com/a/26275926/7167572也有一些答案可能会给你一个提示。
  • @Tatranskymedved 是的。我看到了。它不起作用。有趣的是,如果我关闭设计器视图并运行我的程序,错误就会消失......但是一旦我打开设计器视图,错误就会出现,有什么想法吗? :(
  • 在设计器中,正在为设计器上下文编译解决方案(命名空间默认以 d: 开头)。我遇到了同样的问题(我猜 every1 会),但我还没有检查任何解决方案。
  • 感谢您的宝贵时间,我能够使用自定义列表而不是 x:Array @Tatranskymedved 来解决此问题

标签: c# wpf styles ivalueconverter


【解决方案1】:

我能够通过使用Collection&lt;Thickness&gt; 而不是x:Array 来解决这个问题,我仍然不知道为什么x:Array 会出现这个奇怪的问题。所以我为厚度列表创建了一个包装类。

public class ThicknessList : Collection<Thickness>
{
}

另外一件事是我必须把这个粗细列表资源放在 Style 的资源容器中,如果我把它放在 Border 的资源容器中,我会得到这个奇怪的错误

对象上缺少键值

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

<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>

【讨论】:

  • 您好,您能否介绍一下您是如何使用用户控件的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多