[英]Collection property ConverterParameter is null
我在wpf中遇到過奇怪的行為。 當我嘗試將x:Array
作為轉換器參數傳遞給我的轉換器時,我收到此錯誤。 和設計器視圖顯示錯誤而不是我的控件。
只有在Style
執行此操作時才會發生此錯誤:
property'System.Windows.Data.Binding'。'ConverterParameter'為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步:將用戶控件放在主窗口中。 並運行該程序。 我希望你看到錯誤。 我確實在我的電腦中重現了這一點,所以我認為你也應該這樣做。 我該如何解決這個問題?
我能夠通過使用Collection<Thickness>
而不是x:Array
來解決這個問題,我仍然不知道為什么x:Array
有這個奇怪的問題。 所以我為Thickness列表創建了一個包裝類。
public class ThicknessList : Collection<Thickness>
{
}
另外一件事是我必須把這個厚度列表資源放在Style的資源容器中,如果我把它放在Border的資源容器中我得到這個奇怪的錯誤
缺少對象的鍵值
BTW這是對Style的修復。 (轉換器也需要一些更改,因為傳遞的參數不再是數組,但這在這里並不重要。)
<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.