Wie man List <string> an eine DependencyProperty bindet
Ich versuche, mehr über DependencyProperty zu erfahren. Dazu möchte ich ein neues @ erstellUserControl
zeigt eine Liste an.
Der Speicherort dieser Liste muss im übergeordneten Element als Eigenschaft vorhanden sein. Dafür habe ich nurMainWindow
, MainWindowViewModel (das sind die Eltern) und dasUserControl
(das Kind) (das gerade Code verwendet).
n meinem Hauptfenster habe ich
<Grid>
<uc:RecentList MessageList="{Binding Messages}" />
</Grid>
Und im Code hinter
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
Und das ViewModel
public MainWindowViewModel()
{
this.Messages = new ObservableCollection<string>();
this.Messages.Add("Item 1");
this.Messages.Add("Item 2");
this.T = "hi";
}
public ObservableCollection<string> Messages { get; set; }
In demUserControl
Ich hab
<Grid>
<ListView ItemsSource="{Binding MessageList}"></ListView>
<TextBlock Text="I'm such text to verify this control is showing" />
</Grid>
Und der Code dahinter ist
public static readonly DependencyProperty MessageListProperty =
DependencyProperty.Register(
"MessageList", typeof(IEnumerable<string>), typeof(RecentList));
public IEnumerable<string> MessageList
{
get { return (IEnumerable<string>)GetValue(MessageListProperty); }
set { SetValue(MessageListProperty, value); }
}
Das Problem, das ich habe, ist, dass die Bindung nicht funktioniert. Ich kann dies im Ausgabefenster mit dem Fehler sehen:
Fehler 40: BindingExpression-Pfadfehler: Die Eigenschaft 'MessageList' wurde für 'object' '' MainWindowViewModel '(HashCode = 26034861)' nicht gefunden. BindingExpression: Path = MessageList; DataItem = 'MainWindowViewModel' (HashCode = 26034861); Zielelement ist 'ListView' (Name = ''); Zieleigenschaft ist 'ItemsSource' (Typ 'IEnumerable')
Ich verstehe das Problem, aber ich bin verwirrt. Es sieht an der richtigen Stelle aus (im MainWindowViewModel), aber es sieht aus. Ich verstehe nicht, warum dasUserControl
sucht nach demMessageList
in demMainWindowViewModel
. Ich denke, es liegt daran, dass ich hier den Datenkontext einstelle, aber ich dachte auch, dass, wenn ich @ hinzufügthis.DataContext = this;
an den UserControl-Konstruktor, dann ist es falsch (ich habe es versucht, es hat auch nicht funktioniert).
Updating myUserControl
zu
<ListView ItemsSource="{Binding MessageList, RelativeSource={RelativeSource Mode=TemplatedParent}}"></ListView>
Hilft in dem Sinne, dass ich die Fehlermeldung nicht bekomme, aber auch das Ergebnis nicht sehe.
Das ist, was ich denke, passiert, wenn die Anwendung geladen wird:
MainWindow lädtMainWindow zeigt dann das UserControl an und stellt fest, dass eine Eigenschaft erforderlich ist. Bevor WPF den UserControl-Konstruktor aufruft, ermittelt es den Wert der Eigenschaft. Anschließend wird die Komponente initialisiert und der Wert automatisch in die Eigenschaft @ des UserControls verschobeWie kann mein UserControl die Parents (MainWindow) -Eigenschaft (Messages) verwenden?