10

使用以下示例 R# (resharper) 无法找到 Row 样式的数据上下文,并警告错误绑定(在运行时工作正常)。似乎 Style 没有获取 ItemsSource 的 DataContext:

在此处输入图像描述

MainWindow.xaml:

<Window x:Class="TestDatacontext.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:testDatacontext="clr-namespace:TestDatacontext"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    d:DataContext="{d:DesignInstance testDatacontext:MainWindowVM}"  >

<DataGrid ItemsSource="{Binding Items}" >
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow" >
            <Setter Property="Header" Value="{Binding Name}" />
        </Style>
    </DataGrid.RowStyle>
</DataGrid>
</Window>

主窗口虚拟机:

using System.Collections.ObjectModel;

namespace TestDatacontext
{
    class MainWindowVM
    {
        public ObservableCollection<ItemVM> Items { get; private set; }
    }
}

项目虚拟机:

namespace TestDatacontext
{
    class ItemVM
    {
        public string Name { get; set; }
    }
}
4

1 回答 1

11

你是对的,ReSharper 不知道如何RowStyle在这个特定的控件中使用(它是每个项目的样式ItemsSource吗?还是某种标题样式和绑定可以访问ItemsSource对象本身?),所以它停止遍历树寻找DataContext类型Style声明。

这个问题可以通过Style声明的附加注释来解决:

<Style TargetType="DataGridRow" d:DataContext="{d:DesignInstance vms:ItemVM}">
  <Setter Property="Header" Value="{Binding Name}" />
</Style>

项目可以正常编译,VS 设计器和 R# 可以工作,但 VS xaml 支持会在错误窗口中产生 1 个错误 - “属性 'DataContext' 不能附加到 'Style' 类型的元素”。这有点烦人,但有效。另一种方法是像这样对属性类型进行 quilify:

<Style TargetType="DataGridRow">
  <Setter Property="Header" Value="{Binding (vms:ItemVM.Name)}" />
</Style>

但它也会产生 VS xaml 支持错误:) 并且在运行时的行为略有不同 - 此绑定仅适用于类型的Name属性,ItemVM并且如果在运行时以某种方式将 VM 对象替换为具有属性的其他不同类型的对象,则此绑定将不起作用Name(所以绑定变成了“强类型”)。

我们仍在寻找更好的方法来解决 ReSharper 8.0 中的此类问题,并让 VS 设计师高兴,抱歉造成混淆!

于 2012-11-21T12:22:54.563 回答