Visual Studio无法识别WPF中数据绑定的正确类型

时间:2014-09-10 14:47:48

标签: c# wpf xaml visual-studio-2013 resharper

这是我创建的一个小例子来说明我的问题。

public class DataItem
{
    public DataItem() {}
    public DataItem(bool isSelected)
    {
        IsSelected = isSelected;
    }

    public bool IsSelected { get; set; }
}


public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        Items = new ObservableCollection<DataItem> {new DataItem(true), new DataItem()};
    }

    public ObservableCollection<DataItem> Items { get; set; }
}

XAML是:

<Window x:Class="RoomDesigner.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ignore="http://www.ignore.com"
        xmlns:viewModel="clr-namespace:RoomDesigner.ViewModel"
        mc:Ignorable="d ignore"
        Height="350"
        Width="525"
        d:DataContext="{d:DesignInstance viewModel:MainViewModel}">

    <Grid x:Name="LayoutRoot">
        <ListBox HorizontalAlignment="Left" Height="299" Margin="230,10,0,0" VerticalAlignment="Top" Width="100" 
                 SelectionMode="Multiple"
                 ItemsSource="{Binding Items}">
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="IsSelected" Value="{Binding IsSelected}"/>  <!--This line-->
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding IsSelected}"></TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </Grid>
</Window>

此示例按预期工作:所选项目始终写有TrueFalse写入未选择的项目。

但是,Visual Studio(或Resharper)在标记的行上突出显示单词IsSelected,建议显示为Cannot resolve property 'IsSelected' in data context of type 'RoomDesigner.ViewModel.MainViewModel'。它希望绑定到MainViewModel而不是DataItem为什么。

我使用Visual Studio 13 SP3和Resharper 8.1。

我想知道这种奇怪的行为来自何处以及是否有办法解决它,因为它有点烦人。

1 个答案:

答案 0 :(得分:1)

您应该在Style元素上设置d:DataContext。它不会自动为ItemContainerStyle属性推断。

<Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance viewModel:DataItem}">
    <Setter Property="IsSelected" Value="{Binding IsSelected}"/>  <!--This line-->
</Style>

查看类似问题:Specify datacontext type on listbox ItemContainer in style
另一个类似的问题:How does this setter end up working? (ListView MultiSelect)