C# · 12月 29, 2021

c# – 在列表框中指定ItemContainer的datacontext类型

在List@R_386_2419@中,我有一个ItemContainer的IsSelected属性使用< List@R_386_2419@.ItemContainerStyle>绑定到我的viewmodel的IsSelected属性.句法.

它工作正常,但我得到一个Resharper警告:

Cannot resolve property ‘IsSelected’ in data context of type “FooSolution.Barviewmodel”.

如何在List@R_386_2419@ ItemContainer上指定指定DataContext类型以摆脱此警告?

这是代码.我有一个Barviewmodel类:

public ObservableCollection<Fooviewmodel> FooItems { get;set; }

Barviewmodel被分配给包含List@R_386_2419@的控件中的DataContext

和Fooviewmodel如下:

public bool IsSelected{ get { return isSelected; } set { if (isSelected == value) { return; } isSelected = value; RaisePropertyChanged(() => IsSelected); }}

和XAML这样:

<List@R_386_2419@ ItemsSource=”{Binding FooItems}” SelectionMode=”Multiple”> <List@R_386_2419@.ItemContainerStyle> <Style TargetType=”{x:Type List@R_386_2419@Item}”> <Setter Property=”IsSelected” Value=”{Binding IsSelected}” /> </Style> </List@R_386_2419@.ItemContainerStyle></List@R_386_2419@>

更新
我已经尝试使用设置器设置d:DataContext,如HighCore所建议的,但不幸的是,它不会帮助甚至打破构建:

<Setter Property=”d:DataContext” Value=”{d:DesignInstance yourxmlns:yourItemviewmodelClass}”/>

(抛出:错误1标签“DesignInstance”不存在于XML命名空间“schemas.microsoft.com/expression/blend/2008”;第31行位置50.)

更新2
Finaly,解决方案是在样式元素本身设置d:DataContext(请参见我的答案):

<List@R_386_2419@.ItemContainerStyle> <Style TargetType=”{x:Type List@R_386_2419@Item}” d:DataContext=”{d:DesignInstance local:Fooviewmodel }”> <Setter Property=”IsSelected” Value=”{Binding IsSelected}” /> </Style>解决方法 正如@HighCore所指出的那样,解决方案是从混合SDK中指定d:DataContext属性,但是只有在Style元素本身而不是属性setter中设置时,它才起作用: <List@R_386_2419@.ItemContainerStyle> <Style TargetType=”{x:Type List@R_386_2419@Item}” d:DataContext=”{d:DesignInstance local:Fooviewmodel }”> <Setter Property=”IsSelected” Value=”{Binding IsSelected}” /> </Style></List@R_386_2419@.ItemContainerStyle>

这将删除Resharper的警告,并且还会在viewmodel上重命名属性时更改绑定路径.凉!