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

时间:2016-02-01 16:35:46

标签: c# wpf resharper

我有以下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包含的项目类型?

3 个答案:

答案 0 :(得分:1)

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

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

真正的解决方案是使用DataGridTemplateColumn而不是DataGridTextColumn。这使您可以在DataTemplate中为每个列标识DataType,但需要更多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>

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

JetBrains已经acknowledged that this is a bug并已将其定位在下一个版本中。