2011-05-26 17 views
8

Escenario: UserControl que tiene un TextBox de solo lectura y un Botón. TextBox.Text se modifica y actualiza cada vez que se presiona el botón.WPF: Actualizar Propiedad de Dependencia sin INotifyPropertyChanged (UserControl)

Problema: La propiedad TextControl.Text está vinculada a la propiedad de dependencia UserControl.Message pero no se actualiza cuando UserControl.Message se modifica desde UserControl. Sin embargo, el objetivo se actualiza cuando se implementa INotifyPropertyChanged.

En realidad, no necesito implementar INotifyPropertyChanged en una propiedad de dependencia ¿verdad? ¿Qué me estoy perdiendo? Por favor, consulte el código de demostración here.

Gracias.

Declaración mensaje lugar

public static readonly DependencyProperty MessageProperty = 
     DependencyProperty.Register("Message", typeof (string), 
     typeof (TextControl), new FrameworkPropertyMetadata("[WPFApp]" + 
     Environment.NewLine, OnMessageChanged, OnMessageCoerce)); 

    public string Message 
    { 
     get { return (string) GetValue(MessageProperty); } 
     set { SetValue(MessageProperty, value); } 
    } 

    private static object OnMessageCoerce(DependencyObject obj, 
     object baseValue) 
    { 
     return (string) obj.GetValue(MessageProperty) + (string) baseValue; 
    } 

    private static void OnMessageChanged(DependencyObject d, 
     DependencyPropertyChangedEventArgs e) 
    { 
     // do i need to do this? 
     ((TextControl) d).NotifyPropertyChanged("Message"); 
    } 

control de usuario abreviado XAML

<UserControl x:Class="WPFApp.TextControl" 
     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" 
     mc:Ignorable="d" d:DesignHeight="64" d:DesignWidth="355" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Grid> 
    <TextBox Text="{Binding Message, Mode=OneWay}" ... /> 
    <Button ... /> 
</Grid> 
</UserControl> 

Respuesta

6

1) No, usted no tiene que llamar para NotifyPropertyChanged DependencyProperties.
2) Utilizar una fuente relativa de la unión:

<TextBox Text="{Binding Message, Mode=OneWay,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" ... /> 

Información adicional:

Para encontrar errores relacionados con la unión, busque en el Visual Studio outut ventana de mensajes de error vinculante. En su mayoría son muy claros y te llevan rápidamente al problema.

+0

¡Solución perfecta! Trataré de prestar más atención a la ventana de salida, pero no parece mostrar un error vinculante en este caso. Gracias de nuevo. – BakaBoy

+1

¿Por qué se necesita RelativeSource? ¿Por qué no se hereda el DataContext? –

Cuestiones relacionadas