Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何告诉Resharper ICollectionView包含的类型?_C#_Wpf_Resharper - Fatal编程技术网

C# 如何告诉Resharper ICollectionView包含的类型?

C# 如何告诉Resharper ICollectionView包含的类型?,c#,wpf,resharper,C#,Wpf,Resharper,我有以下XAML: <DataGrid ItemsSource="{Binding Path=FilteredPatients}" SelectedItem="{Binding Path=SelectedPatient}"> <DataGrid.Columns> <DataGridTextColumn Header="Name" Binding="{Binding Path=Format

我有以下XAML:

<DataGrid ItemsSource="{Binding Path=FilteredPatients}" SelectedItem="{Binding Path=SelectedPatient}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name"
                            Binding="{Binding Path=FormattedName}" />
        <DataGridTextColumn Header="Date of Birth"
                            Binding="{Binding Path=BirthDate} />
        <DataGridTextColumn Header="Gender" 
                            Binding="{Binding Path=Gender} />
        <DataGridTextColumn Header="Id"
                            Binding="{Binding Path=Id}" />
    </DataGrid.Columns>
</DataGrid>

Resharper根据父控件的DataContext确定FilteredPatients和SelectedPatient是否正常。但是,FilteredPatients是一个ICollectionView,因此Resharper无法确定它是否包含Patient实例,该实例具有DataGrid列绑定中指定的属性


运行时一切正常,那么如何告诉Resharper FilteredPatients包含的项目类型?

最简单的解决方案是禁用列的Resharper错误,因为它不正确:

<!-- ReSharper disable Xaml.BindingWithContextNotResolved -->
<DataGridTextColumn />
<DataGridTextColumn />
<!-- ReSharper restore Xaml.BindingWithContextNotResolved -->

真正的解决方案是使用DataGridTemplateColumn而不是DataGridTextColumn。这允许您在DataTemplate中为每个列标识数据类型,但需要更多xaml:

<DataGrid ItemsSource="{Binding Path=FilteredPatients}" SelectedItem="{Binding Path=SelectedPatient}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Name">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="namespace:Patient">
                    <TextBlock Text={Binding FormattedName} />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

由于这是设计时和重新竖琴,让它知道的一种方法是在顶部设置DesignInstance,如下所示:

d:DataContext="{d:DesignInstance {x:Type viewModels:MyViewModel}}"

这不会影响生产,但会让Resharper反映ViewModel中的值。

JetBrains已经并计划在下一版本中修复它。

我不想禁用警告,这是我的问题所在。第二种解决方案的问题是它使XAML更长。我希望有一种方法可以简单地告诉Resharper一行中包含的对象是什么,另一种方法是在DataGridTextColumns上单独设置d:DataContext(我假设您已经对整个视图这样做了),但据我所知,在这种情况下不起作用。我在调查这件事的时候试过了,但Resharper还是不喜欢。但是你可以使用它,也许有一种方法可以让它工作。我已经这样做了,这就是为什么DataGrid本身的绑定是可以的(正如我在问题中提到的)。问题是ICollectionView公开了一个没有类型的IEnumerable,因此Resharper不知道FilteredPatients包含的类型。3年后它仍然没有修复。我认为JNPs答案是这里唯一的现实选择是的,这就是我在等待修复时一直在做的:(我也在这里偶然发现了实现通用
ICollectionView
的方法:但是,当我们打开/关闭动态分组时,它在我们的场景中引发了问题。这是否回答了您的问题?