我有以下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包含的项目类型?
答案 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并已将其定位在下一个版本中。