1

私は一般的な辞書コレクション Dictionary を持っています。displaymember パスキーをチェックボックスの内容にバインドし、チェックボックスの Ischecked プロパティをディクショナリの値メンバーにバインドする必要があります

 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

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();

}
于 2013-11-20T10:53:12.240 に答える
1

KeyValuePair には読み取り専用のプロパティがあるため、Dictionary にバインドする場合は OneWay バインディングを使用する必要があります。

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

DataContext が設定されていることを確認してください。ユーザーがチェックボックスを押しても、辞書の値は更新されないことに注意してください。

于 2012-08-16T10:07:22.213 に答える
0

OneWayええ、可能であり、それも機能するはずですが、読み取り専用であるため辞書の値を設定できないため、バインドモードで値をバインドする必要があります。値を変更したい場合は、 をフックする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>

テンプレートに階層が表示されなかったため、 HierarchicalDataTemplatewithを変更したことに注意してください。DataTemplate

于 2012-08-16T10:05:07.260 に答える