如何使用WPF将Dictionary对象绑定到checkedlistbox

时间:2012-08-16 07:15:20

标签: wpf checkedlistbox

  

我有一个通用字典集合词典。我需要将displaymember路径键绑定到复选框的内容,并将复选框Ischecked属性绑定到Dictionary的值成员

 private Dictionary<string, bool> _columnHeaderList;
    public Dictionary<string, bool> ColumnHeaderList
    {
        get { return _columnHeaderList; }
        set { _columnHeaderList = value; RaisePropertyChanged("ColumnHeaderList"); }
    }

    private Dictionary<string, bool> GetColumnList()
    {
        Dictionary<string, bool> dictColumns = new Dictionary<string, bool>();
        Array columns = Enum.GetValues(typeof(ColumnHeaders));
        int arrayIndex=0;
        for(int i=0;i<columns.Length;i++)
        {
            dictColumns.Add(columns.GetValue(arrayIndex).ToString(), true);
        }
        return dictColumns;

    }
  

我的XAML看起来像

 <ListBox Grid.Column="0" Grid.Row="1" Height="200" 
             ItemsSource="{Binding ColumnHeaderList}"
             VerticalAlignment="Top">
        <ListBox.ItemTemplate>
            <HierarchicalDataTemplate>
                <CheckBox Content="{Binding key}" IsChecked="{Binding Path=Value}"></CheckBox>
            </HierarchicalDataTemplate>               
        </ListBox.ItemTemplate>           
    </ListBox>

3 个答案:

答案 0 :(得分:1)

如果绑定到Dictionary,则需要使用OneWay绑定,因为KeyValuePair具有只读属性。

<CheckBox Content="{Binding Key, Mode=OneWay}" IsChecked="{Binding Path=Value, Mode=OneWay}" Width="100" /></CheckBox>

确保已设置DataContext。请注意,当用户按下复选框时,这不会更新字典值。

答案 1 :(得分:0)

是的,它可能也应该有效,尽管你需要将绑定模式的值绑定为OneWay,因为自readOnly以来无法设置字典值。如果您想更改该值,可以挂钩Command(if following MVVVM)或者可以处理Checked event后面的代码。

Key的绑定也不正确,请将key替换为Key。你的最终xaml应该是这样的 -

<ListBox Grid.Column="0" Grid.Row="1" Height="200" 
             ItemsSource="{Binding ColumnHeaderList}"
             VerticalAlignment="Top">
   <ListBox.ItemTemplate>
       <DataTemplate>
           <CheckBox Content="{Binding Key}"
                     IsChecked="{Binding Path=Value, Mode=OneWay}"/>
        </DataTemplate>               
   </ListBox.ItemTemplate>           
</ListBox>

注意我已将HierarchicalDataTemplate更改为DataTemplate,因为我在模板中看不到任何层次结构。

答案 2 :(得分:0)

由于Value属性是只读的,如果用户选中或取消选中复选框,OneWay绑定将不允许您跟踪更改。建议将它们与数组新类ListItem绑定:

class ListItem
{
    public string Text { get; set; }
    public bool IsChecked { get; set; }
}

private ListItem[] GetColumnList()
{
    return Enum.GetValues(typeof(ColumnHeaders))
               .Select(h => new ListItem{ Text = h.ToString(),IsChecked = true})
               .ToArray();

}