2010-10-23 3 views
2

Я пытаюсь написать мультиинжинирующий конвертер для модели навигации, где я загружаю страницы в фрейм, когда какой-либо listboxitem выбран из двух списков. В то же время мне нужно иметь возможность перемещаться с помощью кнопок «Назад/Вперед» из класса навигации и иметь возможность показывать listboxitem в выбранном состоянии, если его UriSource загружен в фрейм. Укрыватель, который у меня есть, может обновлять urisources из двух источников-списков в фрейме, но не может переключать listboxitem в выбранном состоянии. Я переключаю listboxitem в выбранное состояние на части ConvertBack конвертера. Я сделал что-то неправильно, я всегда получаю ошибки на встроенной. Пожалуйста, дайте мне знать, если можно добиться того, что я пытаюсь сделать. Заранее спасибо.Мультиплексирующий конвертер?

Ниже приведен код MultiBindConverter:

public class MultiBindConverter : IMultiValueConverter 
{ 
    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values[0] != null) 
     { 
      if (values[1] != null) 
      { 
       return new Uri(values[1].ToString(), UriKind.RelativeOrAbsolute); 
      } 
      return new Uri(values[0].ToString(), UriKind.RelativeOrAbsolute); 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      var uri = (Uri)value; 
      var uriString = uri.OriginalString; 

      if (uri.OriginalString.Contains(";component/")) 
      { 
       uriString = uriString.Substring(uriString.IndexOf("/") + 1); 
      } 
      return new object[] { uriString, uriString }; 
     } 
    } 
} 

XAML:

<Frame Grid.Column="2" x:Name="ContentFrame" JournalOwnership="OwnsJournal" NavigationUIVisibility="Visible"> 
     <Frame.Source> 
      <MultiBinding Converter="{StaticResource MultiBindConverter}"> 
       <Binding Path="SelectedValue" ElementName="Nav_ListBox"/> 
       <Binding Path="SelectedValue" ElementName="SublevelListbox"/> 
      </MultiBinding> 
     </Frame.Source> 
    </Frame> 

ответ

1

Вы не реализовав интерфейс IMultiValueConverter. Сигнатура ConvertBack является:

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 

Это точная противоположность Convert, которая занимает в массиве и выводит одно значение, так что необходимо принять в этом одно значение и выводить массив значений. Приходящее значение для ConvertBack в этом случае будет источником Frame.Source, а выходы будут 2 свойствами SelectedValue.

+0

Спасибо, что посмотрели мое сообщение. Это то, что мне сложно делать правильно. Мне интересно, если у вас будет возможность показать, как это будет в кодовых строках. Я пытался играть с ним достаточно долго и все еще застрял здесь. – vladc77

+0

Я изменил код, но все еще имею проблему для его запуска. Посмотрите на код выше. Я изменил конвертер. – vladc77

+0

Чтобы вернуть значения свойства SelectedValue, вам нужно вернуть массив из 2 элементов из ConvertBack со значениями в порядке Bindings. Если вам нужно одинаковое значение для обоих, это может быть похоже: return new object [] {uriString, uriString}; Вам также необходимо установить Mode = «TwoWay» на Bindings. –

Смежные вопросы