xaml绑定列表框项的值是否为

时间:2013-02-14 21:11:41

标签: wpf xaml syncfusion

我在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。

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

任何帮助都会很棒,

谢谢! 保罗

1 个答案:

答案 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>