- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 wpf 中遇到了奇怪的行为。每当我尝试将 x:Array
作为转换器参数传递给我的转换器时,我都会收到此错误。设计器 View 显示错误而不是我的控件。
只有当我在 Style
中执行此操作时才会发生此错误:
property 'System.Windows.Data.Binding'.'ConverterParameter' is null.
虽然我的程序编译和运行没有任何问题,但是在设计 View 中它真的很烦人,因为我看不到我的控件,我希望你能找到这个问题的原因并给出解决方案。
我已经简化了我所拥有的,下面是重现此问题的方法(所以这只是示例,并不完全是我所拥有的)。
您只需执行以下步骤即可重现此问题:
第 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 步: 将您的用户控件放在主窗口中。并运行程序。我希望你能看到错误。我确实在我的电脑上复制了这个,所以我认为你也应该得到它。我该如何解决这个问题?
最佳答案
我可以通过使用 Collection<Thickness>
解决这个问题而不是 x:Array
,我还是不知道为什么x:Array
有这个奇怪的问题。所以我为 Thickness 列表创建了一个包装类。
public class ThicknessList : Collection<Thickness>
{
}
还有一件事是我必须把这个厚度列表资源放在 Style 的资源容器中,如果我把它放在 Border 的资源容器中我会得到这个奇怪的错误
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>
关于c# - 集合属性 ConverterParameter 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41922006/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!