在ListBox
中,我有一个ItemContainer的IsSelected
属性,使用IsSelected
语法绑定到我的ViewModel的<ListBox.ItemContainerStyle>
属性。
它工作正常,但我得到了一个Resharper警告:
无法在“FooSolution.BarViewModel”类型的数据上下文中解析属性“IsSelected”。
如何在ListBox ItemContainer上指定指定DataContext类型以消除此警告?
这是代码。我有一个BarViewModel
课程:
public ObservableCollection<FooViewModel> FooItems { get;set; }
BarViewModel
被分配给Control中的DataContext,其中包含ListBox
和FooViewModel
如下:
public bool IsSelected
{
get
{
return isSelected;
}
set
{
if (isSelected == value)
{
return;
}
isSelected = value;
RaisePropertyChanged(() => IsSelected);
}
}
和XAML是这样的:
<ListBox ItemsSource="{Binding FooItems}" SelectionMode="Multiple">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
更新
我已经尝试使用setC来设置d:DataContext
,正如HighCore所建议的那样,但不幸的是,它没有帮助,甚至打破了构建:
<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/>
(抛出:错误1标签'DesignInstance'在XML命名空间'schemas.microsoft.com/expression/blend/2008'中不存在;;第31行位置50.)
更新2
最后,解决方案是在样式元素本身上设置d:DataContext
(参见我的回答):
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
答案 0 :(得分:16)
正如@HighCore指出的那样,解决方法是从blend SDK中指定d:DataContext
属性,但是,只有在自己设置Style元素时才能使用它,而不是在属性设置器中设置:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
这会删除Resharper的警告,并在ViewModel上重新发现属性时更改绑定路径。酷!
答案 1 :(得分:5)
使用d:DataContext="{d:DesignInstance nmspc:Clz}"
标记的其他属性指定Style
没有帮助我:R#/ IntelliSense确实停止突出显示我绑定到的属性,但设计师还向我显示了一条错误消息,而不是视图。
我发现的技巧是在<d:Style.DataContext>
标记内指定Style
。它似乎是如此普遍,它回答了另一个问题,关于使用接口d:DataContext
。
以下是一个小例子,我对这个问题的答案如下: https://stackoverflow.com/a/46637478/5598194
答案 2 :(得分:2)
像这样使用d:DataContext
:
<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/>
您还需要在根元素中添加以下xmlns
:
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
答案 3 :(得分:1)
除了以前的答案:摆脱错误
属性&#39; DataContext&#39;不能附加到&#39; Style&#39;
类型的元素
添加一些虚拟命名空间
xmlns:ignore="designTimeAttribute"
现在使用它代替d:DataContext
<Style TargetType="{x:Type ListBoxItem}" ignore:DataContext="{d:DesignInstance local:FooViewModel }">
...
</Style>