2012-11-21 13 views
8

Poniższa próbka R # (resharper) nie może znaleźć datacontext stylu Row i ostrzega o błędnym powiązaniu (w czasie wykonywania działa dobrze). Wydaje się, że styl nie jest coraz DataContext z ItemsSource:Ustawianie DataContext na 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; } 
    } 
} 

Odpowiedz

10

Masz rację, ReSharper nie ma wiedzy o tym, w jaki sposób RowStyle będzie użyty w tej konkretnej kontrolce (czy jest to styl na każdą pozycję z ItemsSource? lub jakiś rodzaj stylu nagłówka i powiązań będzie miał dostęp do samego obiektu ItemsSource?), więc zatrzyma ruchome drzewo szukając typu DataContext na deklaracji Style.

Ten problem może być rozwiązany z dodatkową adnotacją na Style deklaracji:

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

Projekt zostanie skompilowany grzywny, VS projektant i R # będzie działać, ale wsparcie XAML VS będzie produkować 1 błąd w oknie błędów - „Własność "DataContext" nie można dołączyć do elementów typu "Styl" ". To trochę denerwujące, ale działa. Innym sposobem jest quilify typ właściwości takiego:

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

Ale produkuje VS błędu wsparcia XAML zbyt :) i mają nieco inne zachowanie w czasie pracy - to wiązanie będzie działać tylko z Name własności ItemVM typu i nie będzie działać jeśli w jakiś sposób obiekt VM zostanie zastąpiony innym obiektem innego typu z właściwością Name w czasie wykonywania (w ten sposób wiązanie stanie się "mocno wpisane").

Wciąż szukamy lepszego sposobu rozwiązania tego rodzaju problemów w ReSharper 8.0 i sprawimy, że projektant VS będzie szczęśliwy, przepraszam za zamieszanie!

+0

Dziękuję za wyjaśnienie, ale ... Nie widzę gdzie pozycja 1 elementu ItemsSource == 1 Row jest niepoprawna i czy można ustawić DataContext z RowStyle na jeden z każdego wiersza, nieprawdaż? –

+1

ReSharper nie wie, co semantyczne w 'Row' jest i _how_ styl będzie używany przez kontrolę (lub czy będzie on kiedykolwiek używany?). Tak jak tutaj, R # nie ma pojęcia czym jest 'ColumnHeaderStyle' i jak odnosi się do' ItemsSource' zawierającego kontrolę: https://gist.github.com/4125475 – ControlFlow

+0

Widzę ... Dzięki! –

Powiązane problemy