2011-12-20 3 views
0

В моем приложении WPF я пытаюсь перейти на другие «страницы» с помощью ContentControl. У меня это работает до сих пор, в моем MainViewModel. Я инициировал другие режимы просмотра, которые должны быть частью MainViewModel.Индикатор текущей страницы MVVM

я показываю свои взгляды с DataTemplate, как это:

 <DataTemplate DataType="{x:Type vm:NewsViewModel}"> 
      <Views:NewsView /> 
     </DataTemplate> 

Я получил ItemsControl с TextBlocks, чтобы отобразить PageName свойство View (модели), когда я нажимаю на это, он установить «CurrentView» свойство в соответствии с ViewModel, и оно отображается. Таким образом, это проблема ... Однако проблема, с которой я сталкиваюсь сейчас, заключается в том, как позволить текстовому блоку отображать CurrentView, который у меня есть, например, я хочу, чтобы он был другим цветом, а затем остальными текстовыми блоками, чтобы пользователь мог видеть, какой вид (модель).

Я попытался сделать это в стиле для текстового блока с помощью DataTrigger, но это только принимает постоянные значения, любые идеи?

ответ

1

Почему бы не включить ItemsControl к ListBox, поскольку она имеет встроенные особенности выбора? Вы можете стилизовать его так, чтобы он скрывал выделение выделения и выглядел так же, как ваш ItemsControl, и основывайте свой спусковой крючок на ListBoxItem.IsSelected.

Если вы не хотите этого делать, вы можете использовать IMultiValueConverter для передачи текущего ViewModel и активного ViewModel в конвертер, который вернет True, если элементы совпадают или false, если нет.

+0

Первое предложение кажется лучшим! Благодаря! Не лениться или что-то в этом роде, но как вы можете выровнять элементы в списке по горизонтали? – MrZunz

+0

@MrZunz Вы можете перезаписать шаблон 'ListBox.ItemsPanel', чтобы использовать горизонтальный' StackPanel' или 'WrapPanel' (по умолчанию это вертикальная' StackPanel') – Rachel

+0

Хорошо, я получил это сейчас. Тем не менее все еще возникают проблемы с настройкой переднего плана выбранного элемента. Достаточно найти на google, но они все путают crappy ... – MrZunz

0

Создайте IValueConverter, который возвращает, если представленное представление является активным видом и добавляет его к привязке DataTrigger.

Sample Преобразователь:

public class IsViewActiveConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value == [activeView]; 
    } 
} 

Образец XAML:

<UserControl.Resources> 
    <local:IsViewActiveConverter x:Key="IsViewActive"/> 
</UserControl.Resources> 

<DataTrigger Binding="{Binding View, Converter={StaticResource IsViewActive}}" Value="True"> 
Смежные вопросы