这个二传手最终是如何工作的?(列表视图多选)

本文关键字:列表 视图 工作 何工作 二传手 | 更新日期: 2023-09-27 18:33:17

我有一个ViewModel,我用它来ListViewItemsSource,它实现了一个名为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 的以下部分 - 设计器在Value="{Binding}"部分中为IsSelected下划线,并说"无法解析类型为 [窗口的视图模型的类型] 的数据上下文中的属性'IsSelected'":

    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </ListView.ItemContainerStyle>
  • 如何告诉设计器ListView.ItemContainerStyle的数据上下文应与数据模板的数据上下文相同?
  • 如果 XAML 设计器说无法解析,它最终如何在运行时工作?

更新

这是一个 ReSharper 警告。我可以关闭它,但我想知道的是设置器最终如何工作,因为我为此获得了正确的自动完成:

    <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>

这个二传手最终是如何工作的?(列表视图多选)

应该是 Resharper 在做这个技巧,因为我从未见过默认的设计器智能感知在绑定解释中指出这种类型的错误。您可以完全切换锐化器以完全证明它。

由于您在列表视图项样式中设置属性,并且您正在使用{绑定是选定},它将在每个列表视图项的数据上下文中搜索IsSelected,这是您的ClientViewModel并且具有IsSelected属性...因此绑定是完美的..设计师不够聪明,无法深入探索