2011-08-13 8 views
5

W moim kontroli użytkownika Mam tę właściwość:Jak mogę powiązać pole do kontroli użytkownika

public static DependencyProperty FooListProperty = DependencyProperty.Register(
     "FooList", typeof(List<Problem>), typeof(ProblemView)); 

    public List<Problem> FooList 
    { 
     get 
     { 
      return (List<Problem>)GetValue(FooListProperty); 
     } 
     set 
     { 
      SetValue(FooListProperty, value); 
     } 
    } 

    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     base.OnPropertyChanged(e); 

     if (e.Property == FooListProperty) 
     { 
      // Do something 
     } 
    } 

I od innego okna, Próbuję ustawić wartość dla sterowania ostatni użytkownika:

<local:ProblemView HorizontalAlignment="Center" 
         VerticalAlignment="Center" FooList="{Binding list}" /> 

I to okno obciążenia zawiera:

public List<Problem> list; 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     // Some processes and it sets to list field 
     list = a; 
    } 

Ale w kodzie XAML, wiązanie to nie działa. Nie przekazuj danych. Co ja mylę?

Odpowiedz

1

Nie można powiązać z polem w WPF, należy zamiast tego zmienić właściwość list na właściwość.

Wywołujesz właściwość zależności FooList w swoim UserControl i ResultList w Xaml, ale domyślam się, że to literówka w pytaniu.

Powinieneś zaimplementować INotifyPropertyChanged w Window, aby Wiązania wiedziały, że wartość została zaktualizowana.

Nie jestem pewien, czy masz prawidłową DataContext zestaw w XAML ProblemView, jeśli nie masz pewności można nazwać WindowElementName i używać w wiążącej

<Window Name="window" 
     ...> 
    <!--...--> 
    <local:ProblemView HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         ResultList="{Binding ElementName=window, 
              Path=List}" /> 
    <!--...--> 
</Window> 

Przykładowy kod za

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    //... 

    private List<Problem> m_list; 
    public List<Problem> List 
    { 
     get { return m_list; } 
     set 
     { 
      m_list = value; 
      OnPropertyChanged("List"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

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

    #endregion 
} 
+0

Dzięki milionowi Meleak, działa. Właściwie to samo pytanie zadałem. Naprawdę doceniam twoją pomoc. –

Powiązane problemy