我有一个通用字典集合词典。我需要将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>
答案 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();
}