我有一个来自wpf工具包2的复选框。我无法获取所有选定的项目。我读到我应该使用SelectedItemsOverride来获取我所有选定的项目,但它似乎不起作用。我在TestClassSelected的setter中设置了一个断点但它永远不会被触发。任何想法?
<xctk:CheckListBox Name="MyCheckList"
ItemsSource="{Binding TestClassCollection}"
DisplayMemberPath="DisplayName"
SelectedItemsOverride="{Binding TestClassSelected}" />
public IEnumerable<TestClass> TestClassCollection
{
get { return _testClassCollection; }
set
{
_testClassCollection = value;
OnPropertyChanged("TestClassCollection");
}
}
public List<TestClass> TestClassSelected
{
get { return _testClassSelected; }
set
{
_testClassSelected = value;
OnPropertyChanged("TestClassSelected");
}
}
public class TestClass
{
public String FirstName { get; set; }
public String LastName { get; set; }
public String DisplayName {
get { return string.Format("{0} {1}", FirstName, LastName); }
}
}
这是我一直在使用的测试数据。
TestClassCollection = new List<TestClass>
{
new TestClass {FirstName = "FIrstName", LastName = "LastName"},
new TestClass {FirstName = "Brad", LastName = "Holder"},
new TestClass {FirstName = "Sam", LastName = "Ryans"},
new TestClass {FirstName = "Ryan", LastName = "Thomas"},
new TestClass {FirstName = "Lee", LastName = "Rod"},
new TestClass {FirstName = "Amanda", LastName = "Gustaf"},
new TestClass {FirstName = "Chris", LastName = "Holems"},
new TestClass {FirstName = "Doug", LastName = "Schnitzel"},
new TestClass {FirstName = "Lisa", LastName = "Bull"},
new TestClass {FirstName = "Fred", LastName = "Simpson"},
new TestClass {FirstName = "Scott", LastName = "Rogers"}
};
答案 0 :(得分:2)
尝试在绑定时添加Mode和UpdateSourceTrigger
<xctk:CheckListBox Name="MyCheckList"
ItemsSource="{Binding TestClassCollection}"
DisplayMemberPath="DisplayName"
SelectedItemsOverride="{Binding TestClassSelected,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<强>更新强> 我在Extended WPF Toolkit CodePlex site检查了封闭问题中的示例代码。 尝试将TestClassSelected属性更改为ObservableCollection。 (仍然保留上面描述的.xaml中的UpdateSourceTrigger)
public ObservableCollection<TestClass> TestClassSelected
答案 1 :(得分:1)
我结合了先前的答案/评论,对我有用的是将SelectedItemsOverride
绑定到ObservableCollection<T>
,包括UpdateSourceTrigger=PropertyChanged
,并将方法附加到ObservableCollection<T>
事件CollectionChanged
。
XAML:
<xctk:CheckListBox
ItemsSource="{Binding AllItems}"
DisplayMemberPath="Display"
ValueMemberPath="Value"
SelectedItemsOverride="{Binding Path=DataContext.SelectedItems, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
</xctk:CheckListBox>
ViewModel中的代码:
public IEnumerable<Item> AllItems { get; set; }
public ObservableCollection<Item> SelectedItems { get; set; }
public ViewModel()
{
SelectedItems = new ObservableCollection<Item>();
SelectedItems.CollectionChanged += SelectedItems_CollectionChanged;
}
private void SelectedItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// Handle collection changed event
}
答案 2 :(得分:0)
我遇到了同样的问题,并通过分配属性的私有字段解决了
在您的示例中
private ObservableCollection<TestClass> _testClassSelected=new ObservableCollection<TestClass>();