2012-11-21 2 views
8

En utilisant l'exemple suivant R # (resharper) n'est pas capable de trouver le datacontext du style Row et avertit d'une mauvaise liaison (à l'exécution fonctionne correctement). On dirait que le style ne reçoit pas le DataContext du ItemsSource:Définition de DataContext sur DataGrid.RowStyle

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

Répondre

10

Vous avez raison, ReSharper n'a aucune connaissance sur la façon dont RowStyle sera utilisé dans ce contrôle particulier (est-ce le style pour chaque article de ItemsSource? ou une sorte de style d'en-tête et de liaisons auront accès à l'objet ItemsSource lui-même?), de sorte qu'il arrête de traverser l'arbre à la recherche du type DataContext sur la déclaration Style.

Ce problème peut être résolu avec l'annotation supplémentaire sur Style déclaration:

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

projet compilera bien, concepteur VS et R # fonctionnera, mais le soutien VS XAML produira 1 erreur dans la fenêtre des erreurs - « Propriété 'DataContext' n'est pas attachable aux éléments de type 'Style' ". C'est un peu ennuyeux, mais ça marche. Autre moyen est de quilify type de propriété comme celui-ci:

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

Mais il produit VS erreur de support XAML trop :) et ont un comportement légèrement différent dans l'exécution - cette liaison fonctionnera uniquement avec Name propriété de type ItemVM et ne fonctionnera pas si en quelque sorte l'objet VM sera remplacé par un autre objet de type différent avec la propriété Name lors de l'exécution (donc la liaison est devenue "fortement typée").

Nous sommes toujours à la recherche d'une meilleure façon de résoudre ce genre de problèmes dans ReSharper 8.0 et de rendre le concepteur de VS heureux, désolé de la confusion!

+0

Merci de clarifier mais ... Je ne peux pas voir où la relation 1 article de ItemsSource == 1 Row n'est pas valide et si elle est, vous pouvez définir le DataContext du RowStyle à celui de chaque rangée ne pouvez pas vous? –

+1

ReSharper ne sait pas quelle sémantique de 'Row' est et comment le style sera utilisé par le contrôle (ou sera-t-il jamais utilisé?). Tout comme ici, R # n'a aucune idée de ce que 'ColumnHeaderStyle' est et comment il se rapporte à' ItemsSource' de contrôle de contrôle: https://gist.github.com/4125475 – ControlFlow

+0

Je vois ... Merci! –

Questions connexes