【问题标题】:WPF problem with designer-multiconverter设计器多转换器的 WPF 问题
【发布时间】:2011-05-29 09:47:45
【问题描述】:

我有这个问题。在 XAML 中,我在文本块上使用多转换器。我在文本块上绑定了 4 个字符串属性。

XAML 代码如下所示:

        <TextBlock Style="{StaticResource InfosStyle}"
                   TextWrapping="Wrap"
                   >
                   <TextBlock.Text>
                       <MultiBinding Converter="{StaticResource statusInfoConvertor}">
                           <Binding Path="StatusInfo.IsLogged"  Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
                           <Binding Path="StatusInfo.IsChating" Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
                           <Binding Path="StatusInfo.RoomName"  Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
                           <Binding Path="StatusInfo.LastLogin" Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
                       </MultiBinding>
                   </TextBlock.Text>
        </TextBlock>

转换器如下所示:

public class StatusInfoConverter : IMultiValueConverter
{

    #region Implementation of IMultiValueConverter

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        bool isChatting=false, isLogged=false;


        if (!string.IsNullOrEmpty(values[0].ToString()) && !string.IsNullOrWhiteSpace(values[0].ToString()))
            isLogged = System.Convert.ToBoolean(values[0].ToString());

        if (!string.IsNullOrEmpty(values[1].ToString()) && !string.IsNullOrWhiteSpace(values[1].ToString()))
            isChatting = System.Convert.ToBoolean(values[1].ToString());

        if (isLogged)
        {
            if (isChatting)
            {
                return string.Format(new CultureInfo("sk-Sk"), "Chatuje\nMiestnosť: {0}", values[2]);
            }
            return string.Format(new CultureInfo("sk-SK"), "Iba prihlásení");
        }

        return string.Format(new CultureInfo("sk-Sk"), "Offline");
    }

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

    #endregion
}

问题是我在设计器中遇到了这个错误:

System.FormatException 字符串未被识别为有效的布尔值。 在 System.Boolean.Parse(字符串值) 在 System.Convert.ToBoolean(字符串值) 在 Spirit.Converters.StatusInfoConverter.Convert(Object[] values, Type targetType, Object parameter, CultureInfoculture) 在 C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec_Messenger\ver.beta\Pokec__Messenger\Spirit_v1 .2\Converters\Convertors.cs:第 160 行 在 System.Windows.Data.MultiBindingExpression.TransferValue() 在 System.Windows.Data.MultiBindingExpression.Transfer() 在 System.Windows.Data.MultiBindingExpression.UpdateTarget(布尔 includeInnerBindings) 在 System.Windows.Data.MultiBindingExpression.AttachToContext(布尔最后机会) 在 System.Windows.Data.MultiBindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(布尔 lastChance) 在 MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance) 在 MS.Internal.Data.DataBindEngine.Run(对象 arg) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象 args,Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

第 160 行是:

159.            if (!string.IsNullOrEmpty(values[0].ToString()) && !string.IsNullOrWhiteSpace(values[0].ToString()))
160.                isLogged = System.Convert.ToBoolean(values[0].ToString());

我该如何解决这个问题。如果我编译这段代码并测试应用程序,它可以工作..但是我在设计器中的鞋视图有问题,因为我在 texblock 上绑定了空字符串变量并且还使用了转换器。

【问题讨论】:

    标签: wpf converter


    【解决方案1】:

    几个想法...

    1) 使用设计时数据,以便您拥有有效的绑定来源。见:

    http://karlshifflett.wordpress.com/2009/10/28/ddesigninstance-ddesigndata-in-visual-studio-2010-beta2/

    2) 向您的转换器添加一些仅设计时的逻辑,以处理空字符串。请参阅以下内容以检测设计时:

    http://alanle.com/2009/02/10/design-time-check-for-wpf-and-silverlight/

    科林 E.

    【讨论】:

      【解决方案2】:

      我真的不认为科林的回答是正确的。您的转换器代码中有一个错误,简单明了。您正在执行 values[0].ToString() 而不首先检查 values[0] 是否为空。这与设计时间无关。它也会在运行时崩溃。

      改为:

      string strValue0 = value[0] 作为字符串; string strValue1 = value[1] as string;

      然后进行 IsNullOr 检查...

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-10
        • 2010-10-14
        • 1970-01-01
        • 2011-01-09
        相关资源
        最近更新 更多