Как связать 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)