我在我的WPF应用程序中展示了两个集合,我希望在其中一个集合中禁用另一个集合中的元素。为此,我创建了一个自定义控件FilteringListBox,它继承自ListBox,并且我想在其中添加一些处理来禁用通过FilteringListBox上的属性设置的集合中的元素。现在,我的问题是,即使我在xaml中绑定了ObservableCollection,也没有设置接收要筛选元素的依赖属性。
我创建了一个简化的应用程序来重现这个问题。以下是我的Xaml:
我在FilteringListBox中的FilteringCollection DependencyProperty的setter和getter中添加了断点,但它从未被触发。为什么?我该如何解决?
我创建了一个简化的应用程序来重现这个问题。以下是我的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>
这是我的自定义组件 - 目前仅包含依赖属性:
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);
}
}
}
这里是完整代码的后台和类定义:
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;
}
}
我在FilteringListBox中的FilteringCollection DependencyProperty的setter和getter中添加了断点,但它从未被触发。为什么?我该如何解决?
GetValue
和SetValue
,而属性只是在没有绑定的情况下执行它们。当调用SetValue
时,事件被触发。很遗憾它如此令人困惑。 - Brian Genisio