1

我有一个通用字典集合字典。我需要将 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>
4

3 回答 3

1

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

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

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

于 2012-08-16T10:07:22.213 回答
1

Since Value property is readonly and OneWay binding will not allow you track the changes if user checks or unchecks the checkboxes. It is recommended to bind them with an array new class 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();

}
于 2013-11-20T10:53:12.240 回答
0

是的,它可能并且它也应该可以工作,尽管您需要使用绑定模式绑定值,OneWay因为字典值自只读以来无法设置。如果你想改变这个值,你可以Command(if following MVVVM)在后面的代码中钩住或处理Checked event

另外 Binding forKey不正确,将您的替换keyKey. 你最终的 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>

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

于 2012-08-16T10:05:07.260 回答