2011-01-18 8 views
5

Utworzyłem uproszczoną wersję mojego kodu, która zawiera ten sam problem. Problem polega na tym, że nie jestem pewien, dlaczego właściwość zależności w moim sterowaniu niestandardowym nie jest aktualizowana, gdy zostanie zmieniona w modelu.Powiązanie właściwości zależności i aktualizacja w sterowaniu niestandardowym

Model:

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> 

Code Behind:

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"; 
     } 
    } 
} 

klienta Sterowanie:

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); } 
    } 
} 

Jak widać w formancie niestandardowym, mam kolekcję elementów, które zawierają obiekty z właściwościami zależności, z którymi chcę się połączyć. Tak więc tworzę obiekty w xaml i konfiguruję wiązanie, ale kiedy aktualizuję właściwość binded w modelu, to nie zmienia tego w formancie niestandardowym. Jakieś pomysły?

Odpowiedz

5

Poszukaj błędów wiązania w oknie wyjściowym programu Visual Studio. Myślę, że znajdziesz coś, co wskazuje, że powiązanie w tym polu nie powiodło się.

Kontrolka CustomTextBox zawiera kolekcję obiektów o rozmiarze CustomTextBoxItem, dla których ustawiasz powiązanie. Jednak w żadnym momencie nie dodajesz tych elementów do drzewa logicznego. Przeczytaj mój wpis here, aby zobaczyć, jak dodać te elementy do drzewa logicznego.

+0

Dziękuję bardzo! – gamzu07

+0

Link jest martwy, zaktualizuj go @kentboogaart –

Powiązane problemy