在DataGrid.RowStyle上设置DataContext

Ign*_*cia 9 .net c# wpf resharper mvvm

使用以下示例R#(resharper)无法找到Row样式的datacontext并警告错误的绑定(在运行时工作正常).看起来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>
Run Code Online (Sandbox Code Playgroud)

MainWindowVM:

using System.Collections.ObjectModel;

namespace TestDatacontext
{
    class MainWindowVM
    {
        public ObservableCollection<ItemVM> Items { get; private set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

ItemVM:

namespace TestDatacontext
{
    class ItemVM
    {
        public string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

con*_*low 10

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

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

<Style TargetType="DataGridRow" d:DataContext="{d:DesignInstance vms:ItemVM}">
  <Setter Property="Header" Value="{Binding Name}" />
</Style>
Run Code Online (Sandbox Code Playgroud)

项目编译正常,VS设计器和R#将工作,但VS xaml支持将在错误窗口中产生1个错误 - "属性'DataContext'不能附加到'Style'类型的元素".这有点烦人,但有效.其他方法是像这样quilify属性类型:

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

但它也产生了VS xaml支持错误:)并且在运行时具有稍微不同的行为 - 这种绑定仅适用于类型的Name属性,ItemVM并且如果某个VM对象将Name在运行时被某个其他具有不同类型的对象替换为不同类型的属性,则无法工作(所以绑定变得"强烈打字").

我们仍在寻找一种更好的方法来解决ReSharper 8.0中的这类问题,让VS设计师感到高兴,抱歉令人困惑!

  • 这个有什么进展吗?;-) (2认同)