使用以下示例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>
MainWindowVM:
using System.Collections.ObjectModel;
namespace TestDatacontext
{
class MainWindowVM
{
public ObservableCollection<ItemVM> Items { get; private set; }
}
}
ItemVM:
namespace TestDatacontext
{
class ItemVM
{
public string Name { get; set; }
}
}
答案 0 :(得分:10)
你是对的,ReSharper不知道如何在这个特定的控件中使用RowStyle
(它是ItemsSource
每个项目的样式吗?还是某种标题样式,绑定可以访问到ItemsSource
对象本身?),所以它停止遍历树,在DataContext
声明中查找Style
类型。
可以使用Style
声明中的附加注释来解决此问题:
<Style TargetType="DataGridRow" d:DataContext="{d:DesignInstance vms:ItemVM}">
<Setter Property="Header" Value="{Binding Name}" />
</Style>
Project将编译正常,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设计师感到高兴,抱歉令人困惑!