在我的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提供不同的背景.