Проблема WPF с дизайнером-мультиконвертером - PullRequest
1 голос
/ 22 декабря 2010

У меня есть эта проблема.В 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 [], тип targetType, параметр Object, 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.MultiBindingExindEnt.IDID.InID.AttachToContext (Boolean lastChance) в MS.Internal.Data.DataBindEngine.Task.Run (Boolean lastChance) в MS.Internal.Data.DataBindEngine.Run (объектный аргумент) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (объект обратного вызова Delegate,args, Int32 numArgs) на MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (Источник объекта, Метод делегата, Аргументы объекта, Int32 numArgs, Делегат catchHandler)

В строке 160:

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

Как решить эту проблему.Если я скомпилирую этот код и протестирую приложение, оно будет работать ... но у меня есть проблема с представлением обуви в конструкторе, потому что я связываю пустую строковую переменную в texblock, а также использую конвертер.

Ответы [ 2 ]

0 голосов
/ 26 июля 2015

Я не думаю, что ответ Колина правильный. У вас есть ошибка в вашем коде конвертера, простая и понятная. Вы выполняете значения [0] .ToString () без проверки, если значения [0] вначале пустые Это не имеет никакого отношения ко времени разработки. Это также приведет к сбою во время выполнения.

Вместо этого выполните:

string strValue0 = значение [0] как строка; строка strValue1 = значение [1] как строка;

Затем выполните проверки IsNullOr ...

0 голосов
/ 22 декабря 2010

Пара идей ...

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/

Колин Э.

...