0

我正在 VS 2012 中构建一个 WPF 应用程序,它使用 Code First Entity Framework 以及存储库和 MVVM 模式。

我有两个类: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 是否在 EntityType.LicenseTypes 的集合中,将 LicenseType 列表框中 CheckListBoxItem 的 IsSelected 属性设置为 true(从而“选中”复选框)。

这是我的 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 的属性值:

私人无效ListEntityTypes_OnSelectionChanged(对象发件人,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 中的每个项目,属性值都已更新,因此最后它是错误的,因此没有检查任何项目。

另一种方法与上面类似,但我试图手动“检查”列表框项目,但是我永远无法将 LicenseType 转换回 CheckListItem。

一般来说,我的弱项是处理与其他数据集合相关的记录集合,并构建一个允许用户清楚地添加和关联不同表的界面。

任何帮助都会很棒,

谢谢!保罗

4

1 回答 1

-1

使用转换器。将 IsChecked 绑定到包装列表 (EntityType.LicenseTypes) 的属性,然后使用返回布尔值的 IValueConverter。将 CheckedListBoxItem 的 LicenseType 作为 ConverterParameter 传递。

在 EntityType 类上实现 IPropertyNofity。

当 EntityType.LicenseTypes 列表更改时,在包装的属性上使用 PropertyNotify,并且 isChecked 将更新。

伪代码:

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>
于 2013-02-14T23:06:52.447 回答