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.