Como vincular List <string> a um DependencyProperty
Estou tentando aprender sobre DependencyProperty. Para isso, quero criar um novoUserControl
que exibe uma lista.
O local desta lista deve existir no pai como uma propriedade. Para isso, eu só tenhoMainWindow
, MainWindowViewModel (esses são os pais) e oUserControl
(o filho) (que está usando o code behind).
Na minha MainWindow eu tenho
<Grid>
<uc:RecentList MessageList="{Binding Messages}" />
</Grid>
E no código por trás
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
E o 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; }
NoUserControl
eu tenho
<Grid>
<ListView ItemsSource="{Binding MessageList}"></ListView>
<TextBlock Text="I'm such text to verify this control is showing" />
</Grid>
E o código por trás é
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); }
}
O problema que tenho é que a ligação não está funcionando. Eu posso ver isso na janela de saída, com o erro:
Erro 40: Erro no caminho BindingExpression: propriedade 'MessageList' não encontrada no 'objeto' '' MainWindowViewModel '(HashCode = 26034861)'. BindingExpression: Path = MessageList; DataItem = 'MainWindowViewModel' (HashCode = 26034861); o elemento de destino é 'ListView' (Nome = ''); propriedade de destino é 'ItemsSource' (tipo 'IEnumerable')
Eu entendo o problema, mas estou confuso com isso. Ele está procurando no lugar certo (no MainWindowViewModel), mas está procurando, não entendo por que oUserControl
está procurando oMessageList
noMainWindowViewModel
. Eu acho que é porque é onde eu configuro o datacontext, mas eu também pensei que se eu adicionassethis.DataContext = this;
para o construtor do UserControl, está errado (tentei, também não funcionou).
Atualizando meuUserControl
para
<ListView ItemsSource="{Binding MessageList, RelativeSource={RelativeSource Mode=TemplatedParent}}"></ListView>
Ajuda no sentido de não receber a mensagem de erro, mas também não vejo o resultado.
Isto é o que eu acho que está acontecendo quando o aplicativo é carregado:
Cargas da janela principalMainWindow, em seguida, consulte o UserControl e observa que ele requer uma propriedade.Antes de o WPF chamar o construtor UserControl, ele obtém o valor da propriedade. Em seguida, inicializa o componente e envia automaticamente o valor para a propriedade do UserControlComo meu UserControl pode usar a propriedade Parents (MainWindow) (Messages)