UserControl - DataBinding

0

Witam.

Mam UserControl na którym mam wiele `CheckBoxów' powiązanych z klasą modelu.
Chciałbym zrobić wiązanie do tej kontrolki zawierające listę tych które są zaznaczone.

Metodą z kontrolki działa jak trzeba:

 public ObjectCollection SelectedItems
        {
            get
            {
                return new ObjectCollection(items.Where(x => x.Checked).ToList());
            }
        }

Pytanie jak dorobić do tego DataBinding...

Na Ms znalazłem info o ComplexBindingProperties - wydaje mi się, że to rozwiązanie, ale nie do końca wiem jak tego użyć...

0

Obsłuż zdarzenie CheckBox.CheckedChanged. W obsłudze zdarzenia poprzez interfejs INotifyPropertyChanged odśwież właściwość SelectedItems dla obiektów obserwujących ją. Jak to będzie działać?

  1. Jakiś ItemsSource listy X jest połączony jednokierunkowo z Twoją właściwością public ObjectCollection SelectedItems.
  2. Z każdym wywołaniem metody PropertyChanged(nameof(SelectedItems)) źródło kolekcji w liście X otrzyma powiadomienie, że SelectedItems uległo zmianie i należy odświeżyć zawartość.
  3. Podczas zmiany stanu CheckBoxa obsługujesz zdarzenie CheckBox.CheckedChanged a w nim wywołujesz PropertyChanged(nameof(SelectedItems)). Dzięki temu po każdej zmianie stanu CheckBoxa każdy obiekt zbindowany do SelectedItems pobierze z niego new ObjectCollection(items.Where(x => x.Checked).ToList());
0

Jeśli chodzi o UserControl, to się powinno robić nieco inaczej.
W UserControl powinieneś stworzyć odpowiednie propertisy do sterowania checkboxami (to się nazywa DependencyProperty). UserControl RACZEJ nie powinien mieć modelu w sobie, powinien zależeć od zewnętrznych źródeł. To powinno wyglądać mniej więcej tak:

  1. Załózmy, że masz w UserControl jakiegoś checkboxa (XAML):
<CheckBox name="useSwordCheck">Użyj miecza</CheckBox>

Następnie w pliku cs (codebehind) powinieneś stworzyć dependency property:

public partial class MyUserControl: UserControl
{

    //To jest właściwość, którą będziesz sterował z poziomu XAML'a
    public bool UseSword
    {
        get { return (bool)GetValue(UseSwordProperty );
        set { SetValue(UseSwordProperty, value); }
    }

    //To jest dependency property, dzięki któremu będzie wiadomo, kiedy się zmieniła wartość
    public static readonly DependencyProperty UseSwordProperty = 
        DependencyProperty.Register("UseSword", typeof(bool), typeof(MyUserControl), 
            new FrameworkPropertyMetadada(false, new PropertyChangedCallback(UseSwordChanged)));

    //to jest metoda, która zostanie wywołana po zmianie wartości
    static void UseSwordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MyUserControl ctrl = d as MyUserControl;
        bool value = (bool)e.NewValue;
        ctrl.useSwordCheck.IsChecked = value;
    }
}

Następnie na okienku, w którym używasz tego UserControl, możesz użyć już normalnie bindingu:

<MyUserControl UseSword="{Binding UserSword}" />

Oczywiście bindujesz tutaj właściwość UseSword z ViewModelu okna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1