Wpf 当前页面指示器MVVM

Wpf 当前页面指示器MVVM,wpf,mvvm,contentcontrol,Wpf,Mvvm,Contentcontrol,在我的WPF应用程序中,我试图使用ContentControl导航到其他“页面”。 到目前为止,我已经在MainViewModel中启动了其他应属于MainViewModel的ViewModel 我使用如下数据模板显示我的视图: <DataTemplate DataType="{x:Type vm:NewsViewModel}"> <Views:NewsView /> </DataTemplate>

在我的WPF应用程序中,我试图使用ContentControl导航到其他“页面”。 到目前为止,我已经在MainViewModel中启动了其他应属于MainViewModel的ViewModel

我使用如下数据模板显示我的视图:

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

我得到了一个带有TextBlocks的ItemsControl来显示View(models)PageName属性,当我点击它时,它会将“CurrentView”属性设置为相应的ViewModel并显示出来。所以这不是问题所在。。。但是,我现在遇到的问题是如何让textblock显示我的当前视图,例如,我希望它是另一种颜色,然后是其余的textblock,以便用户可以看到哪个视图(模型)处于活动状态


我尝试用带有DataTrigger的textblock样式来实现这一点,但这只接受常量值,有什么想法吗?

创建一个
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"> 

为什么不将
项目控件
切换到
列表框
,因为它具有内置的选择功能?您可以设置它的样式,使其隐藏选择突出显示,并与您的
项控件
相同,并使触发器基于
ListBoxItem.IsSelected


如果您不想这样做,您可能可以使用将当前ViewModel和活动ViewModel传递给转换器,如果项目相同,转换器将返回True,如果项目不相同,则返回false。

第一个建议似乎是最好的!谢谢不是为了偷懒什么的,但是你怎么能水平对齐列表框中的项目呢?@MrZunz你可以覆盖
列表框。ItemsPanel
模板来使用水平
堆栈面板
,或者
包装面板
(默认为垂直
堆栈面板
)好的,我现在知道了。不过,设置所选项目的前景时仍有问题。在google上可以找到足够多的内容,但它们都非常糟糕…@MrZunz通常要设置SelectedItem背景/前景,你需要覆盖列表框的系统颜色。这里有一个例子: