1

我有一个 ViewModel 用作ItemsSourcefor 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>
4

1 回答 1

1

应该是 Resharper 做到了这一点,因为我从未见过默认设计器 intellisense 在 Binding experssion 中指出这种类型的错误。您可以完全切换 Resharper 以完全证明它。

由于您在 ListViewItem 样式中设置属性并且您使用的是 {Binding IsSelected},因此它将在每个 listviewitem 的 DataContext 中搜索 IsSelected,这是您的 ClientViewModel 并且具有 IsSelected 属性......因此绑定是完美的......设计师不聪明足以探测到这么深

于 2013-09-30T18:26:08.093 回答