设计师 - 多变换器的WPF问题

时间:2010-12-22 13:00:56

标签: wpf converter

我有这个问题。在XAML中,我在textblock上使用多转换器。我在textblock上绑定了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(String value)    at System.Convert.ToBoolean(String value)    at Spirit.Converters.StatusInfoConverter.Convert(Object [] values,Type targetType,Object parameter,CultureInfo culture)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(Boolean includeInnerBindings)    在System.Windows.Data.MultiBindingExpression.AttachToContext(Boolean lastChance)    在System.Windows.Data.MultiBindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)    在MS.Internal.Data.DataBindEngine.Task.Run(布尔值lastChance)    在MS.Internal.Data.DataBindEngine.Run(Object arg)    在System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象args,Int32 numArgs)    在MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source,Delegate方法,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上绑定空字符串varibale并且还使用转换器。

2 个答案:

答案 0 :(得分:0)

一些想法......

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/

Colin E。

答案 1 :(得分:0)

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

相反,请执行:

string strValue0 = value [0] as string; string strValue1 = value [1] as string;

然后执行IsNullOr检查......