私のグーグルスキルは私を失敗させます。誰もがWPFのようなコントロールについて聞いたことがあります。私はそれをこのように見せようとしています(winformsスクリーンショット)。
3 に答える
コンボボックスのDataTemplateを設定することにより、これを自分で行うことができます。この記事では、リストボックスの場合の方法を説明しますが、原則は同じです。
ここにある別の記事は、おそらくあなたがやろうとしていることにもっと適しています。アイテムテンプレートの最初の列をチェックボックスに設定し、それをビジネスオブジェクトのブール値にバインドするだけです。
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsSelected}"
Width="20" />
<TextBlock Text="{Binding DayOfWeek}"
Width="100" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
私のコンボボックスがあります。Martin Harrisコードとこのリンクのコードを使用します。WPFComboBoxは、選択がnullの場合に代替テキストを表示できますか?
<ComboBox Name="cbObjects" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="2,2,6,0" SelectionChanged="OnCbObjectsSelectionChanged" >
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsSelected}" Width="20" VerticalAlignment="Center" Checked="OnCbObjectCheckBoxChecked" Unchecked="OnCbObjectCheckBoxChecked" />
<TextBlock Text="{Binding ObjectData}" VerticalAlignment="Center" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock IsHitTestVisible="False" Name="tbObjects" Text="Выберите объекты..." Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="6,2,6,0" />
データソースの小さなクラス:
public class SelectableObject <T> {
public bool IsSelected { get; set; }
public T ObjectData { get; set; }
public SelectableObject(T objectData) {
ObjectData = objectData;
}
public SelectableObject(T objectData, bool isSelected) {
IsSelected = isSelected;
ObjectData = objectData;
}
}
また、2つのハンドラーがあります。1つはクリックされたCheckBoxを処理するためのもので、もう1つはComboBoxのテキストを形成するためのものです。
private void OnCbObjectCheckBoxChecked(object sender, RoutedEventArgs e) {
StringBuilder sb = new StringBuilder();
foreach (SelectableObject<tblObject> cbObject in cbObjects.Items)
{
if (cbObject.IsSelected)
sb.AppendFormat("{0}, ", cbObject.ObjectData.Description);
}
tbObjects.Text = sb.ToString().Trim().TrimEnd(',');
}
private void OnCbObjectsSelectionChanged(object sender, SelectionChangedEventArgs e) {
ComboBox comboBox = (ComboBox)sender;
comboBox.SelectedItem = null;
}
ComboBox.ItemsSourceには、私が使用します
ObservableCollection<SelectableObject<tblObject>>
ここで、tblObjectはオブジェクトのタイプであり、そのリストをComboBoxに表示します。
このコードが誰かに役立つことを願っています!
ExtendedWPFToolkitのCheckComboBoxを試してみてください。私にとっての主な利点は、バインディング用に2つのリストがあることです。
- 選択可能なすべてのアイテム
- 選択したアイテム
このアプローチの方が実用的だと思います。さらに、バインドするコレクションのメンバーを指定できvalue
ますdisplay
。
を使用して他の多くのコントロールを持ち込みたくない場合は、そのソースコードCheckComboBox
を取得できます。これは非常に簡単です(Selectorクラスも持ち込む必要があります)。