template plantillas wpf xaml binding dependency-properties

wpf - plantillas - Enlace a la propiedad de dependencia personalizada-otra vez



xaml template (1)

Ok lo se Esto se ha pedido literalmente un millón de veces, pero todavía no lo entiendo. Lo siento por eso.

La tarea: implementar la propiedad de dependencia más simple, que se puede usar en xaml así:

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>

Creo que this respuesta es bastante estrecha. Para una mejor legibilidad, copio todo mi código aquí (principalmente de la respuesta anterior).

<UserControl x:Class="Test.UserControls.MyUserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" DataContext="{Binding RelativeSource={RelativeSource Self}}"> <Grid> <!-- Text is being bound to outward representative property; Note the DataContext of the UserControl --> <TextBox Text="{Binding MyTextProperty}"/> </Grid> </UserControl>

y

public partial class MyUserControl1 : UserControl { // The dependency property which will be accessible on the UserControl public static readonly DependencyProperty MyTextPropertyProperty = DependencyProperty.Register("MyTextProperty", typeof(string), typeof(MyUserControl1), new UIPropertyMetadata(String.Empty)); public string MyTextProperty { get { return (string)GetValue(MyTextPropertyProperty); } set { SetValue(MyTextPropertyProperty, value); } } public MyUserControl1() { InitializeComponent(); } }

Y este es mi MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:uc="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525"> <StackPanel Orientation="Vertical"> <uc:MyUserControl1 MyTextProperty="my text goes here"/> <Button Click="ButtonBase_OnClick" Content="click"/> </StackPanel> </Window>

Hasta ahora, todo funciona. Sin embargo, encuentro esto bastante inútil. Lo que necesito es

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>

y poder cambiar esto configurando un DataContext (como suele hacer en MVVM)

Así que reemplacé la línea como arriba y agrego mi código detrás de la siguiente manera:

public partial class MainWindow : Window, INotifyPropertyChanged { public MainWindow() { InitializeComponent(); Text = "Initial Text"; DataContext = this; } private string _Text; public string Text { get { return _Text; } set { if (value != _Text) { _Text = value; NotifyPropertyChanged("Text"); } } } private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { Text = "clicked"; } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } }

Ni el "Texto inicial" ni el "clic" se muestran ... nunca. Así que mi pregunta es cómo implementar un departamento. propiedad correctamente para ser utilizado con

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>

? Gracias por ayudarme.


La propiedad Text está ubicada en el DataContext de MainWindow no del UserControl.

Así que cambie esta línea <uc:MyUserControl1 MyTextProperty="{Binding Text}"/> en esto:

<uc:MyUserControl1 MyTextProperty="{Binding Text, ElementName=MyMainWindow}"/>

Lo que indicará al Enlace que está hablando sobre el elemento de Texto ubicado en su MainWindow. Por supuesto, ya que en este ejemplo usé ElementName , querrás nombrar tu ventana MyMainWindow ...

Así que agrega esto a tu ventana principal:

<Window Name="MyMainWindow" ..... />

Si prefiere no nombrar su ventana, puede usar el enlace RelativeSource FindAncestor de la siguiente manera:

<wpfApplication6:MyUserControl1 MyTextProperty="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>

En ambos sentidos, está solicitando encontrar la propiedad denominada ''Texto'' en el DataContext de la ventana.