Как связать List <string> с DependencyProperty

Я пытаюсь узнать о DependencyProperty. Для этого я хочу создать новыйUserControl который отображает список.

Расположение этого списка должно существовать в родительском объекте как свойство. Для этого у меня есть толькоMainWindow, MainWindowViewModel (это родитель) иUserControl (ребенок) (который в настоящее время использует код позади).

В моем главном окне у меня есть

<Grid>
    <uc:RecentList MessageList="{Binding Messages}" />    
</Grid>

И в коде позади

public MainWindow()
{
    InitializeComponent();
    this.DataContext = new MainWindowViewModel();
}

И 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; }

вUserControl я имею

<Grid>
    <ListView ItemsSource="{Binding MessageList}"></ListView>
    <TextBlock Text="I'm such text to verify this control is showing" />
</Grid>

И код позади

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); }
}

У меня проблема в том, что привязка не работает. Я вижу это в окне вывода с ошибкой:

Ошибка 40: ошибка пути BindingExpression: свойство 'MessageList' не найдено в 'object' '' MainWindowViewModel '(HashCode = 26034861)'. BindingExpression: Path = MessageList; DataItem = 'MainWindowViewModel' (HashCode = 26034861); целевым элементом является ListView (Name = '); Свойство target - «ItemsSource» (тип «IEnumerable»)

Я понимаю проблему, но я смущен этим. Это выглядит в правильном месте (в MainWindowViewModel), но это выглядит, я не понимаю, почемуUserControl ищетMessageList вMainWindowViewModel, Я предполагаю, что это потому, что именно здесь я установил текст данных, но я также подумал, что если я добавлюthis.DataContext = this; в конструктор UserControl, то это неправильно (я пробовал, это тоже не сработало).

Обновление моегоUserControl в

<ListView ItemsSource="{Binding MessageList, RelativeSource={RelativeSource Mode=TemplatedParent}}"></ListView>

Помогает в том смысле, что я не получаю сообщение об ошибке, но я также не вижу результат.

Вот что я думаю происходит при загрузке приложения:

MainWindow загружаетMainWindow затем видит UserControl и отмечает, что для него требуется свойство.Перед тем как WPF вызывает конструктор UserControl, он получает значение свойства. Затем он инициализирует компонент и автоматически передает значение в свойство UserControl.

Как мой UserControl может использовать свойство Parents (MainWindow) (Messages)

Ответы на вопрос(1)

Ваш ответ на вопрос