【问题标题】:How do I tell Resharper the type contained by an ICollectionView?如何告诉 Resharper ICollectionView 包含的类型?
【发布时间】:2016-02-01 16:35:46
【问题描述】:

我有以下 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都ok。但是,FilteredPatients 是一个 ICollectionView,因此 Resharper 无法确定它包含 Patient 的实例,该实例具有 DataGrid 列绑定中指定的属性。

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

【问题讨论】:

标签: c# wpf resharper


【解决方案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>

【讨论】:

  • 我不想禁用警告,这是我的问题的重点。第二种解决方案的问题在于它使 XAML 变得更长。我希望有一种方法可以简单地告诉 Resharper 包含的对象是什么。
  • 您通常可以做到的另一种方法是在 DataGridTextColumns 上单独设置 d:DataContext (我假设您已经为整个视图完成了此操作),但尽我所能告诉这在这种情况下不起作用。我在调查这个问题时尝试了这一点,但 Resharper 仍然不喜欢那样。但是您可以使用它,也许有办法让它发挥作用。
【解决方案2】:

JetBrains 有 acknowledged that this is a bug,并计划在下一个版本中修复它。

【讨论】:

  • 3年后仍未修复。我认为 JNP 的答案是这里唯一真正的选择
  • 是的,这就是我在等待修复时一直在做的事情:(
  • 我也偶然发现了这种实现通用 ICollectionView&lt;T&gt; 的方法:benoitpatra.com/2014/10/12/… 但是当我们动态打开/关闭分组时,它会在我们的场景中引起问题
【解决方案3】:

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

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

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

【讨论】:

  • 我已经做到了,这就是为什么 DataGrid 本身的绑定没问题(正如我在问题中提到的那样)。问题是 ICollectionView 暴露了一个没有类型的 IEnumerable,所以 Resharper 不知道 FilteredPatients 包含的类型。
猜你喜欢
  • 2019-02-03
  • 2021-05-07
  • 2015-11-06
  • 2011-11-19
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2018-08-16
相关资源
最近更新 更多