2012-11-21 40 views
8

使用以下示例R#(resharper)無法找到Row樣式的datacontext並警告錯誤的綁定(在運行時工作正常)。好像風格是沒有得到的ItemsSource的DataContext的:在DataGrid.RowStyle上設置DataContext

enter image description here

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; } 
    } 
} 

回答

10

你是對的,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錯誤太:),並在運行時略有不同的行爲 - 這種結合將只與ItemVMName物業工作,將無法正常工作如果以某種方式將虛擬機對象替換爲一些不同類型的其他對象,並在運行時使用Name屬性(因此綁定變爲「強類型」)。

我們仍在尋找一種更好的方式來解決ReSharper 8.0中的這類問題,並讓VS設計師感到高興,抱歉讓人困惑!

+0

感謝澄清,但...我無法看到ItemsSource == 1行的關係1項無效,如果是您可以將RowStyle的DataContext設置爲每行之一不能? –

+1

ReSharper不知道「行」的語義是什麼,樣式將被控件使用(或者它會被使用嗎?)。就像這裏一樣,R#不知道'ColumnHeaderStyle'是什麼,它與包含控件的'ItemsSource'有什麼關係:https://gist.github.com/4125475 – ControlFlow

+0

我明白了......謝謝! –