简体   繁体   English

WPF StringFormat设计器错误

[英]WPF StringFormat Designer error

I made a MultiBind Converter to format a TextBlock into a template. 我做了一个MultiBind Converter,将TextBlock格式化为模板。 One dependency property "StringFormat" was created for the user to define the format the text will appear in the TextBlock. 为用户创建了一个依赖项属性“ StringFormat”,以定义文本将出现在TextBlock中的格式。 The other property (Value) already exists in the parent object. 父对象中已经存在另一个属性(值)。 The codes are as follows: 代码如下:

** XAML ** ** XAML **

<TextBlock
    x:Name="myText">
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource StringFormatConverter}">
            <Binding Path="Value" RelativeSource="{RelativeSource TemplatedParent}"/>
            <Binding Path="StringFormat" RelativeSource="{RelativeSource TemplatedParent}"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

** C# ** ** C# **

public class StringFormatConverter : IMultiValueConverter
{
    public object Convert(
        object[] value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        string val = string.Empty;

        if (value[1] != null)
        {
            val = (string)(value[1].ToString());
            return String.Format(culture, val, value[0]);
        }
        else return value[0];
    }

    public object[] ConvertBack(
        object value,
        Type[] targetTypes,
        object parameter,
        CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

When I run the application, it runs without errors, and the passed format string works as expected. 当我运行该应用程序时,它运行时没有错误,并且传递的格式字符串按预期工作。 However, in designer mode, it displays the following message: 但是,在设计器模式下,它显示以下消息:

XamlParseException: Input string was not in a correct format. XamlParseException:输入字符串的格式不正确。

StackTrace 堆栈跟踪

at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter) at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter) at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List 1 affectedChildren, UncommonField 1 templatedNonFeChildrenField) at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List 1 affectedChildren) at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField 1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate) at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container) at System.Windows.FrameworkElement.ApplyTemplate() 在System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader,XamlObjectWriter currentWriter)在System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)在System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject的容器,IComponentConnector componentConnector,IStyleConnector styleConnector,列表1 affectedChildren, UncommonField位于System.Windows.StyleHelper.ApplyTemplateContent(位于System.Windows.StyleHelper.ApplyTemplateContent(位于System.Windows.StyleHelper.ApplyTemplateContent(列出1 affectedChildren) at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField孩子1 affectedChildren) at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField 1 dataField,DependencyObject容器,FrameworkElementFactory templateRoot,Int32 lastChildIndex,HybridDictionary childIndexFromChildID,FrameworkTemplate框架模板)处的1个templatedNonFeChildrenField)。 Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField,FrameworkElement容器)在System.Windows.FrameworkElement.ApplyTemplate()

InnerException: Input string was not in a correct format. InnerException:输入字符串的格式不正确。

FormatException: Input string was not in a correct format. FormatException:输入字符串的格式不正确。

StackTrace 堆栈跟踪

at System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args) at System.String.Format(IFormatProvider provider, String format, Object[] args) at Ipiranga.WPF.Componentes.Componentes.StringFormatConverter.Convert(Object[] value, Type targetType, Object parameter, CultureInfo culture) at System.Windows.Data.MultiBindingExpression.TransferValue() at System.Windows.Data.MultiBindingExpression.Transfer() at System.Windows.Data.MultiBindingExpression.UpdateTarget(Boolean includeInnerBindings) at System.Windows.Data.MultiBindingExpression.AttachToContext(Boolean lastChance) at System.Windows.Data.MultiBindingExpression.AttachOverride(DependencyObject d, DependencyProperty dp) at System.Windows.Data.BindingExpressionBase.OnAttach(DependencyObject d, DependencyProperty dp) at System.Windows.StyleHelper.GetInstanceValue(UncommonField 1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry) at System.Windows.StyleHelper.GetChildValueHelper(UncommonField 在System.Text.StringBuilder.AppendFormat(IFormatProvider提供程序,字符串格式,Object [] args)在System.String.Format(IFormatProvider提供程序,字符串格式,Object []参数)在Ipiranga.WPF.Componentes.Componentes.StringFormatConverter.Convert (在System.Windows.Data.MultiBindingExpression.UpdateTarget(在System.Windows.Data.MultiBindingExpression.Transfer()处)(Object []值,类型targetType,Object参数,CultureInfo文化) System.Windows.Data.MultiBindingExpression.AttachToContext(Boolean lastChance)在System.Windows.Data.MultiBindingExpression.AttachOverride(DependencyObject d,DependencyProperty dp)在System.Windows.Data.BindingExpressionBase.OnAttach(DependencyObject d,DependencyProperty d) )在System.Windows.StyleHelper.GetInstanceValue(UncommonField 1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry) at System.Windows.StyleHelper.GetChildValueHelper(UncommonField 1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry) at System.Windows.StyleHelper.GetChildValueHelper(UncommonField 1 dataField, ItemStructList 1& valueLookupList, DependencyProperty dp, DependencyObject container, FrameworkObject child, Int32 childIndex, Boolean styleLookup, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.GetChildValue(UncommonField 1 dataField, DependencyObject container, Int32 childIndex, FrameworkObject child, DependencyProperty dp, FrugalStructList 1& childRecordFromChildIndex, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.GetValueFromTemplatedParent(DependencyObject container, Int32 childIndex, FrameworkObject child, DependencyProperty dp, FrugalStructList 1& childRecordFromChildIndex, FrameworkElementFactory templateRoot, EffectiveValueEntry& entry) 1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry) at System.Windows.StyleHelper.GetChildValueHelper(UncommonField 1 dataField,ItemStructList 1& valueLookupList, DependencyProperty dp, DependencyObject container, FrameworkObject child, Int32 childIndex, Boolean styleLookup, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.GetChildValue(UncommonField 1& childRecordFromChildIndex, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.GetValueFromTemplatedParent(DependencyObject container, Int32 childIndex, FrameworkObject child, DependencyProperty dp, FrugalStructList 1&childRecordFromChildIndex,FrameworkElementFactory templateRoot,EffectiveValueEntry&条目)
at System.Windows.StyleHelper.ApplyTemplatedParentValue(DependencyObject container, FrameworkObject child, Int32 childIndex, FrugalStructList 1& childRecordFromChildIndex, DependencyProperty dp, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.InvalidatePropertiesOnTemplateNode(DependencyObject container, FrameworkObject child, Int32 childIndex, FrugalStructList 1& childRecordFromChildIndex, Boolean isDetach, FrameworkElementFactory templateRoot) at System.Windows.FrameworkTemplate.InvalidatePropertiesOnTemplate(DependencyObject container, Object currentObject) at System.Windows.FrameworkTemplate.HandleBeforeProperties(Object createdObject, DependencyObject& rootObject, DependencyObject container, FrameworkElement feContainer, INameScope nameScope) at System.Windows.FrameworkTemplate.<>c__DisplayClass6.b__3(Object sender, XamlObjectEventArgs args) at System.Xaml.XamlObjectWriter.OnBeforeProperties(Object value) at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToP 在System.Windows.StyleHelper.InvalidatePropertiesOnTemplateNode(DependencyObject容器,FrameworkObject子项,Int32ChildIndex,Index 1& childRecordFromChildIndex, DependencyProperty dp, FrameworkElementFactory templateRoot) at System.Windows.StyleHelper.InvalidatePropertiesOnTemplateNode(DependencyObject container, FrameworkObject child, Int32 childIndex, FrugalStructList Boolean isDetach,位于System.Windows.FrameworkTemplate.InvalidatePropertiesOnTemplate(DependencyObject容器,Object currentObject)处,位于System.Windows.FrameworkTemplate.HandleBeforeProperties(创建对象的对象,DependencyObject&rootObject,DependencyObject容器,FrameworkElement feContainer,INameScope nameScope),位于System.Windows。 FrameworkTemplate。<> c__DisplayClass6.b__3(Object sender,XamlObjectEventArgs args)at System.Xaml.XamlObjectWriter.OnBeforeProperties(Object value)at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToP arentStart(ObjectWriterContext ctx) at System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property) at System.Xaml.XamlWriter.WriteNode(XamlReader reader) System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember属性)处的arentStart(ObjectWriterContext ctx)System.Xaml.XamlWriter.WriteNode(XamlReader阅读器)处

What am I doing wrong, since the code runs and works properly? 由于代码可以正常运行,我在做什么错? Thanks in advance! 提前致谢!

I'd have to guess that your safety check is bad. 我不得不猜测您的安全检查不好。 Don't check for value[x] != null, use the as keyword: 不要检查value [x]!= null,请使用as关键字:

string strVal = value[1] as string;

Reason being is you probably aren't getting null, but rather DependencyProperty.UnsetValue. 原因是您可能没有得到null,而是DependencyProperty.UnsetValue。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM