Frage DataContext auf DataGrid.RowStyle setzen


Mit dem folgenden Beispiel kann R # (resharper) den Datenkontext des Row-Stils nicht finden und warnt vor einer falschen Bindung (zur Laufzeit klappt es). Scheint so, als würde der Style den DataContext der ItemsSource nicht bekommen:

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>

HauptfensterVM:

using System.Collections.ObjectModel;

namespace TestDatacontext
{
    class MainWindowVM
    {
        public ObservableCollection<ItemVM> Items { get; private set; }
    }
}

ArtikelVM:

namespace TestDatacontext
{
    class ItemVM
    {
        public string Name { get; set; }
    }
}

8
2017-11-21 11:49


Ursprung


Antworten:


Sie haben Recht, ReSharper hat kein Wissen darüber, wie RowStyle wird in diesem speziellen Steuerelement verwendet (ist es Stil für jedes Element von ItemsSource? oder irgendeine Art von Header-Stil und Bindungen haben Zugriff auf ItemsSource Objekt selbst?), also hört es auf, nach dem Baum zu suchen DataContext tippen Sie ein Style Erklärung.

Dieses Problem kann mit zusätzlichen Anmerkungen behoben werden Style Erklärung:

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

Projekt wird gut kompilieren, VS Designer und R # wird funktionieren, aber VS Xaml-Unterstützung wird 1 Fehler im Fehlerfenster erzeugen - "Eigenschaft 'DataContext' ist nicht an Elemente vom Typ 'Style' anfügbar". Das ist ein bisschen nervig, aber funktioniert. Eine andere Möglichkeit besteht darin, den Eigenschaftstyp folgendermaßen zu quilifizieren:

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

Aber es produziert VS xaml Support-Fehler zu :) und haben etwas anderes Verhalten in der Laufzeit - diese Bindung funktioniert nur mit Name Eigentum von ItemVM Typ und wird nicht funktionieren, wenn irgendwie VM-Objekt mit einem anderen Objekt anderen Typs mit ersetzt wird Name Eigenschaft zur Laufzeit (so verbindlich wurde "stark typisiert").

Wir suchen immer noch nach einem besseren Weg, um diese Art von Problemen in ReSharper 8.0 zu lösen, und machen VS Designer glücklich, sorry für Verwirrung!


10
2017-11-21 12:22