1

CheckBox 項目を含む WPF ComboBox があり、ユーザーは複数の項目を選択できます。

ユーザーがコンボボックスからアイテムを選択した後、選択したアイテムのリストをコンマ区切りのテキストとしてコンボボックスに表示したいと考えています。

XAML:

<ComboBox  Name="cmbEnvironment"  >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected}" Content="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox> 

コードビハインド:

var lstEnvironment = new List<Environment>();
lstEnvironment.Add( new Environment() { Name = "Env1", IsSelected = false});
lstEnvironment.Add(new Environment() { Name = "Env2", IsSelected = false });
lstEnvironment.Add(new Environment() { Name = "Env3", IsSelected = false });
cmbEnvironment.ItemsSource = lstEnvironment;

モデル:

public class Environment
{
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

どうすればこれを達成できますか?

4

2 に答える 2

0

あなたが望む振る舞いのために、より良い解決策は、あなたのアイテムを表示するために、またはのようなものでクリック( Expander、、Popupなど)で拡大することではないでしょうか?そうしないと、奇妙な選択や開閉動作が発生する可能性があります。ItemsControlListView

しかし、とにかく、個人的には、以下を含むデータクラスを作成します。

string SelectedItems { get; set; }
ObservableCollection<Enviornment> AvailableItems { get; set; }

そして、このようなことをします:

そして、PropertyChange通知をEnviornmentクラスに追加して、次のようなことができるようにします。

foreach(var item in AvailableItems)
    item.PropertyChanged += Environment_PropertyChanged;

...

void Environment_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "IsSelected")
        SelectedItems = string.Join(",", 
            availableItems.Where(p => p.IsSelected)
            .Select(p => p.Name).ToArray());
}

ToArray()(がフレームワークの一部であるかどうかは思い出せませんが、そうでない場合、この回答には、リストを配列に簡単に変換してで使用できるようにするための優れた拡張メソッドがありますstring.Join

ただし、現在の設定を使用して、CheckBox.CheckChangedまたはComboBox.SelectionChangedにキャストcmbEnvironment.ItemsSourceするコードビハインドを追加List<Environment>し、チェック済みアイテムのカンマ区切り文字列を作成してから、カンマ区切り文字列cmbEnvironment.Textと等しく設定することもできます。

于 2013-01-09T16:30:20.400 に答える
0

将来の読者のために:これには(無料の)拡張WPFツールキットをお勧めします。これには、まさにこれを行うCheckComboBoxが含まれています。

于 2016-08-02T07:14:45.820 に答える