CodeGo.net> WinRT XAML-如何在列表视图中样式选定的项目?

在我的WinRT应用中,我想显示状态值列表并突出显示当前状态.显示列表时,它应该是只读的,因此不能与用户交互.尽管我使用的是ListView,但我希望禁用任何选择功能.我认为禁用ListView可以达到目的.
但是目前在我后面的代码中;

  public IList<JobStatusItem> StatusList
    {
        get
        {
            var values = Enum.GetValues(typeof(JobStatus));
            var selected = Status.ToString();
            var i = 0;
            var list = new List<JobStatusItem>();
            foreach (var value in values)
            {
                i++;
                var item = GetStatusDisplay(value.ToString());
                list.Add(new JobStatusItem
                {
                    Id = i,
                    Status = item,
                    Selected = value.ToString().Equals(selected)
                });                    
            }

            return list;
        }
    }

对于我的XAML

                <ListView x:Name="ListStatus" 
                          IsItemClickEnabled="False" 
                          IsSwipeEnabled="False"
                          SelectionMode="Single" 
                          ItemsSource="{Binding Path=AssignedJobs.SelectedDay.SelectedJob.StatusList, Mode=OneWay}"
                          >
                    <ListView.ItemContainerStyle>
                        <Style TargetType="ListViewItem">
                            <Setter Property="IsSelected" Value="{Binding Path=Selected, Mode=OneWay}"/>
                        </Style>
                    </ListView.ItemContainerStyle>

                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Path=Status}"></TextBlock>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

而且当我运行此命令时,所选状态未设置为所选状态.为什么会这样,我该如何解决?

解决方法:

您的代码中的绑定表达式(< Setter Property =“ IsSelected” Value =“ {Binding Path = Selected,Mode = OneWay}” />)无效,因为上下文不在项目级别.

由于WinRT中缺少祖先绑定,因此很难使用纯绑定来实现所需的功能.但是,在后面的代码中检查IsSelected属性非常简单.最终,如果您需要纯XAML解决方案,则始终可以将下面的代码包装在Behavior中.

您基本上想订阅ListView的ContainerContentChanging事件,并手动设置ItemContainer的IsSelected属性以匹配模型JobStatusItem的Selected属性.像这样-

    private void OnListViewContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args)
    {
        if (args.ItemContainer != null && !args.InRecycleQueue && args.Phase == 0)
        {
            args.ItemContainer.IsSelected = ((JobStatusItem)args.Item).Selected;

另一种可能的解决方案

由于您需要一个带有突出显示的选择的只读列表,因此最好通过将ListView的SelectionMode设置为None来完全禁用ListView上的任何单击/点击交互.

然后在您的DataTemplate内部,将TextBlock带边框包装起来,并在Selected属性为true时为Border提供不同的背景.

上一篇:c#-WPF和XAML中的OxyPlot线注释可见性


下一篇:会议预约管理信息系统(三)