2011-01-18 31 views
5

He creado una versión simplificada de mi código que experimenta el mismo problema. El problema es que no estoy seguro de por qué la propiedad de dependencia en mi control personalizado no se actualiza cuando cambia en el modelo.Enlace de propiedades de dependencia y actualización en control personalizado

Modelo:

public class MainWindowModel : INotifyPropertyChanged 
{ 
    private bool isChecked; 
    public bool IsChecked { get { return isChecked; } set { isChecked = value; OnPropertyChanged("IsChecked"); } } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void OnPropertyChanged(string prop) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
    } 
} 

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:custom="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <custom:CustomTextbox x:Name="TextboxName" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" TextChanged="CustomTextbox_TextChanged"> 
     <custom:CustomTextbox.CustomTextboxItems> 
      <custom:CustomTextboxItem IsChecked="{Binding IsChecked}" /> 
     </custom:CustomTextbox.CustomTextboxItems> 
    </custom:CustomTextbox> 

    <Button Content="Do It" Click="Button_Click" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20" /> 
</Grid> 
</Window> 

código subyacente:

public partial class MainWindow : Window 
{ 
    MainWindowModel model; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     model = new MainWindowModel(); 
     this.DataContext = model; 
    } 

    private void CustomTextbox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     model.IsChecked = true; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if (TextboxName.CustomTextboxItems[0].IsChecked) 
     { 
      TextboxName.Text = "Property successfully changed"; 
     } 
    } 
} 

control personalizado:

public class CustomTextbox : TextBox 
{ 
    public CustomTextbox() 
    { 
     CustomTextboxItems = new ObservableCollection<CustomTextboxItem>(); 
    } 

    public ObservableCollection<CustomTextboxItem> CustomTextboxItems { get; set; } 
} 

public class CustomTextboxItem : FrameworkElement 
{ 
    public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(CustomTextboxItem), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

    public bool IsChecked 
    { 
     get { return (bool)GetValue(IsCheckedProperty); } 

     set { SetValue(IsCheckedProperty, value); } 
    } 
} 

Como puede ver en el control personalizado, tengo una colección de elementos que contienen objetos con propiedades de dependencia a los que me quiero vincular. Así que creo los objetos en el xaml y configuro el enlace, pero cuando actualizo la propiedad en el modelo, no lo cambia en el control personalizado. ¿Algunas ideas?

Respuesta

5

Busque errores de enlace en la ventana de resultados de Visual Studio. Creo que encontrará algo que le diga que el enlace en la casilla de verificación ha fallado.

Su control CustomTextBox tiene una colección de objetos CustomTextBoxItem, contra los cuales está configurando un enlace. Sin embargo, en ningún momento está agregando esos elementos al árbol lógico. Lee mi publicación here para ver cómo agregar esos elementos al árbol lógico.

+0

¡Muchas gracias! – gamzu07

+0

Ese enlace está muerto, por favor actualízalo @kentboogaart –

Cuestiones relacionadas