J'ai deux collections affichées dans mon application WPF, et j'aimerais que les éléments de l'une d'entre elles soient désactivés dans l'autre. Pour ce faire, je crée un contrôle personnalisé FilteringListBox qui hérite de ListBox, et je veux ajouter une manipulation à l'intérieur pour désactiver les éléments qui sont définis dans un ensemble de collection à travers une propriété sur le FilteringListBox. Maintenant, mon problème est que la propriété de dépendance prenant le ObservableCollection que je veux filtrer des éléments n'est pas définie - même si je me lie à elle dans le xaml.Pourquoi ma propriété de dépendance n'est-elle pas définie lors de la liaison?
J'ai créé une application simplifiée où je reproduis le problème. Voici mon Xaml:
<StackPanel>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical">
<TextBlock>Included</TextBlock>
<ListBox x:Name="IncludedFooList" ItemsSource="{Binding IncludedFoos}"></ListBox>
</StackPanel>
<Button Margin="10" Click="Button_Click">Add selected</Button>
<StackPanel Orientation="Vertical">
<TextBlock>Available</TextBlock>
<Listbox:FilteringListBox x:Name="AvailableFooList" ItemsSource="{Binding AvailableFoos}" FilteringCollection="{Binding IncludedFoos}"></Listbox:FilteringListBox>
</StackPanel>
</StackPanel>
</StackPanel>
Ceci est mon composant personnalisé - qui détient actuellement seulement la propriété Dépendance:
public class FilteringListBox : ListBox
{
public static readonly DependencyProperty FilteringCollectionProperty =
DependencyProperty.Register("FilteringCollection", typeof(ObservableCollection<Foo>), typeof(FilteringListBox));
public ObservableCollection<Foo> FilteringCollection
{
get
{
return (ObservableCollection<Foo>)GetValue(FilteringCollectionProperty);
}
set
{
SetValue(FilteringCollectionProperty, value);
}
}
}
Et pour le code complet du code sous-jacent et les définitions de classe sont ici:
public partial class MainWindow : Window
{
private MainViewModel _vm;
public MainWindow()
{
InitializeComponent();
_vm = new MainViewModel();
DataContext = _vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (AvailableFooList.SelectedItem == null)
return;
var selectedFoo = AvailableFooList.SelectedItem as Foo;
_vm.IncludedFoos.Add(selectedFoo);
}
}
public class MainViewModel
{
public MainViewModel()
{
IncludedFoos = new ObservableCollection<Foo>();
AvailableFoos = new ObservableCollection<Foo>();
GenerateAvailableFoos();
}
private void GenerateAvailableFoos()
{
AvailableFoos.Add(new Foo { Text = "Number1" });
AvailableFoos.Add(new Foo { Text = "Number2" });
AvailableFoos.Add(new Foo { Text = "Number3" });
AvailableFoos.Add(new Foo { Text = "Number4" });
}
public ObservableCollection<Foo> IncludedFoos { get; set; }
public ObservableCollection<Foo> AvailableFoos { get; set; }
}
public class Foo
{
public string Text { get; set; }
public override string ToString()
{
return Text;
}
}
J'ajoute des points d'arrêt au setter et au getter de DependencyProperty FilteringCollection dans FilteringListBox, mais il n'est jamais déclenché. Pourquoi? Comment puis-je le réparer?
+1. J'aimerais que ce soit plus simple ... une meilleure convention pour créer DependancyProperties ... mais c'est ce que nous devons vivre avec. Le getter/setter est simplement une commodité pour le développeur mais n'a aucune signification pour la liaison de données. C'est en fait l'inverse. Le système de liaison appelle 'GetValue' et' SetValue' et la propriété le fait sans liaison. L'événement est déclenché lorsque 'SetValue' est appelé. Il craint que cela soit si confus. –
Hmm .. Pas très intuitif ou pratique, mais cela l'a réparé. Merci! – stiank81