Laden...

Intellisense/Autovervollständigung im ItemsControl

Erstellt von p!lle vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.970 Views
p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 7 Jahren
Intellisense/Autovervollständigung im ItemsControl

Moin,

bevor ich zu meiner Frage komme, zuerst ein Beispiel zum besseren Verständnis.

Gegeben ist folgende Situation:

public class MeineTolleKlasse
{
    public string Text { get; set; }
    public int Zahl { get; set; }
}

//Property in meinem ViewModel
IList<MeineTolleKlasse> MyList { get; }

In der dazugehörigen View kann ich nun mit Hilfe der Intellisense des ReSharpers die Bindings für die DataGridTextColumn problemlos vervollständigen, da er den korrekten Typ der ItemsSource automatisch erkannt hat (MeineTolleKlasse).

<DataGrid ItemsSource="{Binding MyList}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Z" Binding="{Binding Zahl}" />
        <DataGridTextColumn Header="T" Binding="{Binding Text}" />
    </DataGrid.Columns>
</DataGrid>

Schreibt man z.B. "{Binding Blub}", unterkringelt er Blub und gibt einen Hinweis aus - was auch korrekt ist:> Fehlermeldung:

Cannot resolve property 'Blub' in data context of type 'MeineTolleKlasse'

Die ItemsSource selbst wird in der Klasse ItemsControls definiert.
Lege ich mir jetzt ein eigenes, von ItemsControl abgeleitetes, Control an und füge in diesem Control z.B. folgende Property hinzu

public ObservableCollection<DataGridColumn> Columns { get; }

kann ich beim Definieren der Columns im XAML ebenfalls die Vervollständigung nutzen.

Nun ist mir allerdings nicht ganz klar, wie er die Verbindung zum Typ der ItemsSource herstellt.
Habe zwar bereits den Code des ItemsControl durchgeschaut, mir ist allerdings nichts aufgefallen, was helfen könnte.
Bin mir allerdings auch nicht sicher, ob es nicht "Magic" vom ReSharper ist.
Hat jemand eine Idee?

Hintergrund der Frage ist ein Control auf Arbeit, was ich gerne um diese Möglichkeit der Autovervollständigung erweitern möchte.

EDIT:
Lege ich ein Control an, was einfach nur von Control erbt, und definiere in diesem eine Dependency Property "ItemsSource" (die den gleichen Aufbau wie die DP im ItemsControl hat), kann ich die Autovervollständigung nicht nutzen.

W
955 Beiträge seit 2010
vor 7 Jahren

Dann schau mal in der XAML nach ob der DataContext angegeben wurde

p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 7 Jahren

Welche XAML meinst du denn jetzt?

W
955 Beiträge seit 2010
vor 7 Jahren

Ich meinte dass in deiner xaml im Rootknoten eine Eigenschaft gesetzt ist die den Typ des ViewModels erklärt, ExpressionBlend macht es glaube ich so. Und mit deiner xaml meine ich die Datei von der du den xml-Codeschnipsel gepostet hast.

5.299 Beiträge seit 2008
vor 7 Jahren

Mir ist nicht recht klar, wonach du eiglich fragst.
Ob es Resharper ist oder das ItemsControl selbst, was es bewerkstelligt, dass in seim Inneren der Item-DataContext gilt statt des umgebenden?

Es liegt am ItemsControl, nicht am Resharper.

Wenn du allerdings fragst wie ItemsControl das bewerkstelligt, muss ich passen. Und wie man das selber hinkriegt - passe ich ebenfalls.

Wenn ich sowas haben will, dann erbe ich eben von ItemsControl - dann habe ichs ja.

Oder was genau ist die Frage?

Der frühe Apfel fängt den Wurm.

p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 7 Jahren

@witte:
Ja, der Typ des DataContext wurde gesetzt, sonst würde es ja für das DataGrid auch nicht gehen. 😉

Für alle 3 Controls werden beim Setzen der ItemsSource die Properties des VM angeboten.
Zudem ist beim DataGrid und beim MyItemsControl die Autovervollständigung für die Columns anhand der Properties des Typs der ItemsSource möglich...

<DataGrid Grid.Row="1" ItemsSource="{Binding MyList}" AutoGenerateColumns="False">
	<DataGrid.Columns>
		<DataGridTextColumn Header="Z" Binding="{Binding Zahl}" /> <!-- Autovervollst. anhand der Properties des Typs der ItemsSource möglich -->
		<DataGridTextColumn Header="T" Binding="{Binding Text}" /> <!-- Autovervollst. anhand der Properties des Typs der ItemsSource möglich -->
	</DataGrid.Columns>
</DataGrid>

<views:MyItemsControl Grid.Row="2" ItemsSource="{Binding MyList}"> <!-- vom ItemsControl abgeleitet -->
	<views:MyItemsControl.Columns>
		<DataGridTextColumn Header="Z" Binding="{Binding Zahl}" /> <!-- Autovervollst. anhand der Properties des Typs der ItemsSource möglich -->
		<DataGridTextColumn Header="T" Binding="{Binding Text}" /> <!-- Autovervollst. anhand der Properties des Typs der ItemsSource möglich -->
	</views:MyItemsControl.Columns>
</views:MyItemsControl>

<views:MyControl Grid.Row="3" ItemsSource="{Binding MyList}"> <!-- vom Control abgeleitet -->
	<views:MyControl.Columns>
		<DataGridTextColumn Header="Z" Binding="{Binding Zahl}" /> <!-- Zahl wird unterkringelt und im VM gesucht -->
		<DataGridTextColumn Header="T" Binding="{Binding Text}" /> <!-- Text wird unterkringelt und im VM gesucht -->
	</views:MyControl.Columns>
</views:MyControl>

@ErfinderDesRades:
Dein vierter Satz ist meine Frage. 😉
Würde gerne wissen, wie man diese Abhängigkeit hinbekommt.

Natürlich wäre es am einfachsten, selbst vom ItemsControl zu erben, allerdings ist das nicht unbedingt immer möglich. Also wäre es gut, wenn man weiß, wie es funktioniert. =)

M
177 Beiträge seit 2009
vor 7 Jahren

Möglicherweise arbeiten die mit GetIsInDesignMode und setzen dann z.B. sowas in der Art


d:DataContext="{d:DesignInstance myNamespace:MyViewModel, IsDesignTimeCreatable=True}"