c# - significa - Enlace de datos en controles de usuario WPF
seo imagenes wordpress (3)
Estoy creando un UserControl para una serie de controles compartidos por varias ventanas. Uno de los controles es una etiqueta que muestra el flujo de algún otro proceso en términos de "números de protocolo".
Estoy tratando de ofrecer DataBinding con esta etiqueta para que la ventana refleje automáticamente el estado del proceso a medida que cambia la variable de número de protocolo.
Este es el control de usuario XAML:
<UserControl Name="MainOptionsPanel"
x:Class="ExperienceMainControls.MainControls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
<Label Height="Auto" Name="numberLabel">Protocol:</Label>
<Label Content="{Binding Path=ProtocolNumber}" Name="protocolNumberLabel"/>
(...)
</UserControl>
Y este es el Código-Detrás:
public partial class MainControls
{
public MainControls()
{
InitializeComponent();
}
public int ProtocolNumber
{
get { return (int)GetValue(ProtocolNumberProperty); }
set { SetValue(ProtocolNumberProperty, value); }
}
public static DependencyProperty ProtocolNumberProperty =
DependencyProperty.Register("ProtocolNumber", typeof(int), typeof(MainControls));
}
Esto parece estar funcionando porque si en el constructor configuro ProtocolNumber a un valor arbitrario, se refleja en el control del usuario.
Sin embargo, al usar este control de usuario en la ventana final, el enlace de datos se rompe.
XAML:
<Window x:Class="UserControlTesting.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:expControl="clr-namespace:ExperienceMainControls;assembly=ExperienceMainControls"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
<StackPanel>
<expControl:MainControls ProtocolNumber="{Binding Path=Number, Mode=TwoWay}" />
</StackPanel>
</Window>
Code-Behind para la ventana:
public partial class Window1 : Window
{
public Window1()
{
Number= 15;
InitializeComponent();
}
public int Number { get; set; }
}
Esto establece el número de protocolo en cero, ignorando el valor establecido en Número.
He leído un ejemplo
Lo que tienes en efecto:
<expControl:MainControls DataContext="{Binding RelativeSource={RelativeSource Self}}"
ProtocolNumber="{Binding Path=Number, Mode=TwoWay}"/>
=> No configure el DataContext
en las declaraciones de UserControl
, use los enlaces RelativeSource
o ElementName
lugar.
Si no especifica el RelativeSource
del enlace, intente configurar DataContext
en el constructor:
public Window1()
{
Number= 15;
DataContext = this;
InitializeComponent();
}
si miras la ventana de salida, deberías ver la excepción vinculante.
El problema que tiene es el siguiente: dentro de su control de usuario vinculará la etiqueta al Número de protocolo DP de su control de usuario y no al DataContext
, por lo que debe agregar, por ejemplo, el nombre del elemento al enlace.
<UserControl Name="MainOptionsPanel"
x:Class="ExperienceMainControls.MainControls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="uc"
>
<Label Height="Auto" Name="numberLabel">Protocol:</Label>
<Label Content="{Binding Path=ProtocolNumber, ElementName=uc}" Name="protocolNumberLabel"/>
(...)
</UserControl>
EDITAR: para aclarar algunas cosas, tu usercontrol también funciona si cambias el enlace en tu MainWindow. pero debe vincular al DataContext de MainWindow con RelativeSource.
<expControl:MainControls ProtocolNumber="{Binding Path=Number, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />