我有一个ViewModel,它用作ItemsSource
的{{1}},它实现了一个名为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
所以{{1} property:
ISelectable
这完美无缺;在窗口的ViewModel中,我可以定义如下属性:
IsSelected
我得到了我所期待的。
我的问题是关于XAML的下面部分 - 设计师在<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>
部分强调public IEnumerable<ClientViewModel> SelectedClients
{
get
{
return _searchResults == null
? null
: _searchResults.Where(e => e.IsSelected);
}
}
并在类型[类型的数据]的数据上下文中说“无法解析属性'IsSelected' window的ViewModel]“:
IsSelected
Value="{Binding}"
的数据上下文应该与数据模板的数据上下文相同?
这是ReSharper警告。我可以将其关闭,但我想知道的是 setter最终如何工作,因为我得到了正确的自动完成:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListView.ItemContainerStyle>
但不是那样:
ListView.ItemContainerStyle
答案 0 :(得分:1)
应该是Resharper正在做的伎俩,因为我从来没有看到默认设计师intellisense在Binding experssion中指出这种类型的错误。你可以完全切换Resharper来完全证明它。
因为你在ListViewItem样式中设置属性而你正在使用{Binding IsSelected},它将在每个listviewitem的DataContext中搜索IsSelected,它是你的ClientViewModel并且具有IsSelected属性...因此绑定是完美的..设计师不够聪明,不能探究这个深层次的