Ich habe ein Objekt, das im Code instanziiert ist, zum Beispiel heißt die XAML window.xaml und innerhalb der window.xaml.cs
protected Dictionary<string, myClass> myDictionary;
Wie kann ich dieses Objekt beispielsweise mit nur XAML-Markups an eine Listenansicht binden?
Aktualisieren:
(Genau das habe ich in meinem Testcode):
<Window x:Class="QuizBee.Host.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="{Binding windowname}" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
</Grid>
</Window>
Und im Codebehind
public partial class Window1 : Window
{
public const string windowname = "ABCDEFG";
public Window1()
{
InitializeComponent();
}
}
Angenommen, der Titel sollte "ABCDEFG" werden, oder? aber es zeigt am Ende nichts.
Antworten:
Sie können den DataContext für Ihr Steuerelement, Formular usw. wie folgt festlegen:
Klarstellung :
Der Datenkontext, der auf den obigen Wert gesetzt wird, sollte an jedem Element erfolgen, das den Code dahinter "besitzt". Für ein Fenster sollten Sie ihn daher in der Window-Deklaration festlegen.
Ich habe Ihr Beispiel mit diesem Code arbeiten:
Der auf dieser Ebene festgelegte DataContext wird dann von jedem Element im Fenster geerbt (es sei denn, Sie ändern ihn explizit für ein untergeordnetes Element). Nach dem Festlegen des DataContext für das Fenster sollten Sie also in der Lage sein, von jedem Steuerelement aus direkt an CodeBehind- Eigenschaften zu binden auf dem Fenster.
quelle
Es gibt einen viel einfacheren Weg, dies zu tun. Sie können Ihrem Fenster oder UserControl einen Namen zuweisen und dann über ElementName binden.
Window1.xaml
Window1.xaml.cs
quelle
Die Antwort von Guy ist zwar richtig (und passt wahrscheinlich zu 9 von 10 Fällen), aber es ist erwähnenswert, dass Sie dies zurücksetzen, wenn Sie versuchen, dies von einem Steuerelement aus zu tun, dessen DataContext bereits weiter oben im Stapel eingerichtet ist, wenn Sie DataContext festlegen zurück zu sich selbst:
Dies wird dann natürlich Ihre vorhandenen Bindungen brechen.
In diesem Fall sollten Sie die RelativeSource für das Steuerelement festlegen, das Sie binden möchten, und nicht für das übergeordnete Steuerelement.
dh zum Binden an die Eigenschaften eines UserControls:
Angesichts der Tatsache, wie schwierig es derzeit sein kann, zu sehen, was mit der Datenbindung los ist, sollten Sie dies berücksichtigen, auch wenn Sie feststellen, dass diese Einstellung
RelativeSource={RelativeSource Self}
derzeit funktioniert :)quelle
Nur ein bisschen mehr Klarstellung: Eine Eigenschaft ohne 'get', 'set' kann nicht gebunden werden
Ich stehe dem Fall genauso gegenüber wie dem Fall des Fragestellers. Und ich muss die folgenden Dinge haben, damit die Bindung richtig funktioniert:
quelle
Konverter definieren:
Binden Sie an eine benutzerdefinierte Definition eines Wörterbuchs. Es gibt viele Überschreibungen, die ich weggelassen habe, aber der Indexer ist wichtig, da er das Ereignis "Eigenschaft geändert" ausgibt, wenn der Wert geändert wird. Dies ist erforderlich, damit die Bindung zwischen Quelle und Ziel erfolgt.
Verwenden Sie in Ihrer .xaml-Datei diesen Konverter. Zuerst darauf verweisen:
Wenn Ihr Wörterbuch beispielsweise einen Eintrag enthält, in dem der Schlüssel "Name" lautet, können Sie ihn binden: Verwenden Sie ihn
quelle
Machen Sie Ihre Eigenschaft "Windowname" zu einer DependencyProperty und behalten Sie diese bei.
quelle
Stellen Sie in Ihrem Code dahinter den DataContext des Fensters auf das Wörterbuch ein. In Ihrer XAML können Sie schreiben:
Dadurch wird die ListView an das Wörterbuch gebunden.
Für komplexere Szenarien wäre dies eine Teilmenge der Techniken hinter dem MVVM- Muster.
quelle
Eine Möglichkeit wäre, eine ObservableCollection (System.Collections.ObjectModel) zu erstellen und Ihre Wörterbuchdaten dort zu haben. Dann sollten Sie in der Lage sein, die ObservableCollection an Ihre ListBox zu binden.
In Ihrer XAML sollten Sie ungefähr Folgendes haben:
quelle
Ich hatte genau das gleiche Problem, aber meines nicht, weil ich eine lokale Variable festgelegt habe ... Ich befand mich in einem untergeordneten Fenster und musste einen relativen Datenkontext festlegen, den ich gerade zur Fenster-XAML hinzugefügt habe.
quelle
Sie können x: Referenztrick versuchen
quelle