custom controles control wpf user-controls

custom - controles wpf c#



¿Cómo se lee un parámetro pasado en un UserControl de WPF? (5)

En el caso del código que publicó anteriormente, es un problema de tiempo; a la propiedad FirstMessage no se le ha asignado su valor cuando se ejecuta el constructor. Tendría que ejecutar ese código en un evento que ocurra más tarde, como Loaded.

Creé un control de usuario en WPF:

<UserControl x:Class="TestUserControl.Controls.GetLatest" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <TextBlock Name="theTextBlock"/> </UserControl>

El código detrás tiene un parámetro llamado "FirstMessage" que establece como el texto de mi control de usuario TextBlock:

public partial class GetLatest : UserControl { public string FirstMessage { get; set; } public GetLatest() { InitializeComponent(); theTextBlock.Text = this.FirstMessage; } }

En mi código principal, puedo configurar el parámetro FirstMessage en mi control de usuario con intellisense:

<Window x:Class="TestUserControl.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" xmlns:controls="clr-namespace:TestUserControl.Controls" > <StackPanel> <controls:GetLatest FirstMessage="This is the title"/> </StackPanel> </Window>

Sin embargo, todavía no establece el texto. Intenté Text = "{Binding Path = FirstMessage}" y otras sintaxis que encontré, pero nada funciona.

¿Cómo puedo acceder al valor de FirstMessage en mi control de usuario?


Este ejemplo rápido no usará ningún enlace porque el valor no se configura hasta después de llamar al Constructor predeterminado, pero aquí se explica cómo puede hacer que aparezca el texto.

<UserControl x:Class="TestUserControl.Controls.GetLatest" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="GetLatest_Loaded"> <TextBlock Name="theTextBlock"/> </UserControl>

Entonces, simplemente modifica tu archivo cs a esto:

public partial class GetLatest : UserControl { public string FirstMessage { get; set; } public GetLatest() { InitializeComponent(); theTextBlock.Text = this.FirstMessage; } private void GetLatest_Loaded(object sender, RoutedEventArgs e) { theTextBlock.Text = this.FirstMessage; } }

Recomiendo trabajar en la configuración de un enlace en su lugar, ya que es bastante código similar a un espagueti.


FirstMessage se establece después de que se ha llamado al constructor. Deberías cambiar tu texto del setter de FirstMessage.

Al inicializar un objeto desde XAML, primero se llama al constructor predeterminado, luego las propiedades se establecen en el objeto.


Su enfoque de enlace no funciona porque su propiedad FirstMessage no notifica cuando se actualiza. Use las Propiedades de Dependencia para eso. Vea abajo:

public partial class GetLatest : UserControl { public static readonly DependencyProperty FirstMessageProperty = DependencyProperty.Register("FirstMessage", typeof(string), typeof(GetLatest)); public string FirstMessage { get { return (string)GetValue(FirstMessageProperty); } set { SetValue(FirstMessageProperty, value); } } public GetLatest() { InitializeComponent(); this.DataContext = this; } }

XAML:

<UserControl x:Class="TestUserControl.Controls.GetLatest" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <TextBlock Text="{Binding FirstMessage}" /> </UserControl>

Cada vez que la propiedad FirstMessage cambie, su bloque de texto se actualizará solo.


También puedes usar:

public partial class GetLatest : UserControl { private string _firstMessage; public string FirstMessage { get { return _firstMessage; } set { _firstMessage = value; theTextBlock.Text = value; } } public GetLatest() { InitializeComponent(); } }