我在VS 2012中构建一个使用Code First Entity Framework以及存储库和MVVM模式的WPF应用程序。
我有两个类:EntityType和LicenseType。
EntityType由以下内容指定:
private int _id;
private string _name;
private string _description;
private List<LicenseType> _licenseTypes = new List<LicenseType>();
LicenseType声明为:
private int _id;
private string _name;
private string _description;
并且为这些私有字段声明了公共属性。
我将ObservableCollection绑定到CheckedListBox(Syncfusion产品)。
没问题。
在它下面,我将另一个CheckedListBox绑定到ObservableCollection。
再次,没问题。
我不能做的是将LicenseType列表框中CheckListBoxItem的IsSelected属性设置为true(从而“检查”复选框),具体取决于该特定LicenseType是否在EntityType.LicenseTypes的集合中。
以下是CheckedListBox的代码:
<syncfusion:CheckListBox x:Name="lstAllLicenseTypes" ItemsSource="{Binding AllLicenseTypes}" DisplayMemberPath="Name" >
<syncfusion:CheckListBox.ItemContainerStyle>
<Style TargetType="syncfusion:CheckListBoxItem">
<Setter Property="IsSelected" Value="{Binding ????}"/>
</Style>
</syncfusion:CheckListBox.ItemContainerStyle>
</syncfusion:CheckListBox>
我尝试了两种方法,第一种方法是循环遍历每个LicenseType列表框项,检查是否与EntityType的LicenseType集合有关联,并尝试设置绑定到XAML的Property值:
private void ListEntityTypes_OnSelectionChanged(object sender,SelectionChangedEventArgs e) { var thisEntity =(EntityType)listEntityTypes.SelectedItems [0];
foreach (object t in lstAllLicenseTypes.Items)
{
bool hasAssociation = _vmEntityTypes.EntityHasAssociationWithThisLicenseType(thisEntity,(LicenseType) t);
if (hasAssociation)
{
_vmEntityTypes.CurrentEntityIsAssociatedWithCurrentLicenseType = true;
}
else
{
_vmEntityTypes.CurrentEntityIsAssociatedWithCurrentLicenseType = false;
}
}
}
此处的目的是绑定到属性“CurrentEntityIsAssociatedWithCurrentLicenseType”。这没用。我认为它不起作用,因为对于CheckedListBox中的每个项目,属性值都已更新,因此,最后它是false,因此没有检查任何项目。
另一种方法与上面类似,但我试图手动“检查”列表框项,但我永远不会将LicenseType强制转换回CheckListItem。
一般来说,我所处理的是处理与其他数据集合相关的记录集合,并构建一个允许用户清楚地添加和关联不同表格的界面。
任何帮助都会很棒,
谢谢! 保罗
答案 0 :(得分:-1)
使用转换器。将IsChecked绑定到包装列表的属性(EntityType.LicenseTypes),然后使用返回布尔值的IValueConverter。将CheckedListBoxItem的LicenseType作为ConverterParameter传递。
在EntityType类上实现IPropertyNofity。
当EntityType.LicenseTypes列表更改时,在包装属性上使用PropertyNotify,isChecked将更新。
Psuedo代码:
public class EntityType : INotifyPropertyChanged
{
...
public List<LicenseType> LicenseTypes
{
get { return _licenseTypes; }
set
{
_licenseTypes = value;
OnNotifyPropertyChanged("LicenseTypes");
}
}
}
public class ListToCheckedConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter ...
{
var list = (List<LicenseType>)value;
var type = (LicenseType)parameter;
return list.Contains(type);
}
...
}
XAML:
<syncfusion:CheckListBox x:Name="lstAllLicenseTypes" ItemsSource="{Binding AllLicenseTypes}" DisplayMemberPath="Name" >
<syncfusion:CheckListBox.ItemContainerStyle>
<Style TargetType="syncfusion:CheckListBoxItem">
<Setter Property="IsSelected"
Value="{Binding Path=LicenseTypes,
Converter = ListToCheckedConverter,
ConverterParameter = Header}"/>
</Style>
</syncfusion:CheckListBox.ItemContainerStyle>
</syncfusion:CheckListBox>