Cómo enlazar List <string> a una DependencyProperty
Estoy tratando de aprender sobre DependencyProperty. Para hacerlo quiero crear un nuevoUserControl
que muestra una lista.
La ubicación de esta lista debe existir en el padre como una propiedad. Para esto solo tengoMainWindow
, MainWindowViewModel (estos son los padres) y elUserControl
(el hijo) (que actualmente usa el código detrás).
En mi ventana principal tengo
<Grid>
<uc:RecentList MessageList="{Binding Messages}" />
</Grid>
Y en el código detrás
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
Y el modelo de vista
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; }
En elUserControl
yo tengo
<Grid>
<ListView ItemsSource="{Binding MessageList}"></ListView>
<TextBlock Text="I'm such text to verify this control is showing" />
</Grid>
Y el código detrás es
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); }
}
El problema que tengo es que el enlace no funciona. Puedo ver esto en la ventana de salida, con el error:
Error 40: Error de ruta de BindingExpression: propiedad 'MessageList' no encontrada en 'objeto' '' MainWindowViewModel '(HashCode = 26034861)'. BindingExpression: Path = MessageList; DataItem = 'MainWindowViewModel' (HashCode = 26034861); el elemento de destino es 'ListView' (Nombre = ''); la propiedad de destino es 'ItemsSource' (tipo 'IEnumerable')
Entiendo el problema, pero estoy confundido. Está buscando en el lugar correcto (en MainWindowViewModel) pero está buscando No entiendo por quéUserControl
está buscando elMessageList
en elMainWindowViewModel
. Supongo que es porque ahí es donde configuré el contexto de datos, pero también pensé que si agregabathis.DataContext = this;
para el constructor de UserControl, entonces está mal (lo he intentado, tampoco funcionó).
Actualizando miUserControl
a
<ListView ItemsSource="{Binding MessageList, RelativeSource={RelativeSource Mode=TemplatedParent}}"></ListView>
Ayuda en el sentido de que no recibo el mensaje de error, pero tampoco veo el resultado.
Esto es lo que creo que sucede cuando se carga la aplicación:
MainWindow cargasMainWindow luego ve el UserControl y observa que requiere una propiedad.Antes de que WPF llame al constructor UserControl, toma el valor de la propiedad. Luego inicializa el componente y automáticamente transfiere el valor a la propiedad de UserControl¿Cómo puede mi UserControl usar la propiedad Parents (MainWindow) (Messages)