Индикатор текущей страницы MVVM

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

Я отображаю свои представления с помощью шаблона данных следующим образом:

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

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

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


person MrZunz    schedule 20.12.2011    source источник


Ответы (2)


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

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

person Rachel    schedule 20.12.2011
comment
Первое предложение кажется лучшим! Спасибо! Не лениться или что-то в этом роде, но как вы можете выровнять элементы в списке по горизонтали? - person MrZunz; 20.12.2011
comment
@MrZunz Вы можете перезаписать шаблон ListBox.ItemsPanel, чтобы использовать горизонтальный StackPanel или WrapPanel (по умолчанию используется вертикальный StackPanel) - person Rachel; 20.12.2011
comment
Хорошо, теперь я понял. Тем не менее, все еще возникают проблемы с установкой переднего плана выбранного элемента. В гугле можно найти достаточно, но они все чертовски дерьмовые... - person MrZunz; 21.12.2011
comment
@MrZunz Обычно для установки фона / переднего плана SelectedItem вам необходимо перезаписать SystemColors для ListBox. Вот пример: stackoverflow.com/a/7298301/302677 - person Rachel; 21.12.2011

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

Пример конвертера:

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"> 
person Kolky    schedule 20.12.2011