这是我创建的一个小例子来说明我的问题。
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>
此示例按预期工作:所选项目始终写有True
,False
写入未选择的项目。
但是,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。
我想知道这种奇怪的行为来自何处以及是否有办法解决它,因为它有点烦人。
答案 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)。