我有一个 ViewModel 用作ItemsSource
for a ListView
,它实现了一个名为ISelectable
:
/// <summary>
/// An interface that should be implemented by a ViewModel that can be
/// marked as selected, when multiple selections are allowed.
/// </summary>
public interface ISelectable
{
/// <summary>
/// Gets or sets a value indicating whether this instance is selected.
/// </summary>
/// <value>
/// <c>true</c> if this instance is selected; otherwise, <c>false</c>.
/// </value>
bool IsSelected { get; set; }
}
ListView
正在显示“搜索客户端”功能的搜索结果,因此所有项目都是实例ClientViewModel
- 并且ClientViewModel
实现ISelectable
了一个IsSelected
属性:
<ListView x:Name="SearchResultsList" ItemsSource="{Binding SearchResults}">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type viewModels:ClientViewModel}">
<Label Content="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这完美地工作;在窗口的 ViewModel 中,我可以定义如下属性:
public IEnumerable<ClientViewModel> SelectedClients
{
get
{
return _searchResults == null
? null
: _searchResults.Where(e => e.IsSelected);
}
}
我得到了我所期待的。
我的问题是关于 XAML 的以下部分 - 设计者IsSelected
在该Value="{Binding}"
部分中加了下划线并说“无法在类型 [窗口 ViewModel 的类型] 的数据上下文中解析属性 'IsSelected'”:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListView.ItemContainerStyle>
- 如何告诉设计者数据上下文
ListView.ItemContainerStyle
应该与数据模板的上下文相同? - 如果 XAML 设计人员说它无法解决,它如何最终在运行时工作?
更新
这是一个 ReSharper 警告。我可以把它关掉,但我想知道的是setter 最终是如何工作的,因为我得到了正确的自动完成:
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type viewModels:ClientViewModel}">
<Label Content="{Binding Name}" /> <!-- "Name" is available from IntelliSense -->
</DataTemplate>
</ListView.ItemTemplate>
但不是为了那个:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
<!-- "IsSelected" isn't, IntelliSense is showing the members of the Window's ViewModel -->
</Style>
</ListView.ItemContainerStyle>