2

項目に CheckBox が必要な ComboBox に取り組んでいます。これらのチェックボックスの変更に対応する機能を実装しました。その機能の一部は、CheckBoxes から ComboBox のコンテンツを確立します (つまり、'pear'、'apple'、および 'blueberry' を選択すると、コンボはこれらの項目をチェックする必要があり、そのコンテンツは 'pear; apple;' である必要があります)。ブルーベリー')。

やりました。しかし、私は ComboBox を使用しているため、チェックボックスの外側の項目をクリックするたびに項目が選択されるため、項目のテキストによってコンテンツが上書きされます。この xaml は、その記述方法を示しています。

<ComboBox   IsEditable="True" DataContext="{Binding}" 
        IsTextSearchEnabled="False" IsReadOnly="True">
<ComboBox.ItemTemplate>
    <DataTemplate >
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding   Path=EstaSeleccionado, 
                                            Mode = TwoWay, 
                                            UpdateSourceTrigger=PropertyChanged}"/>
            <TextBlock Text="{Binding Path=Item.Value}"/>
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>

チェックボックスを無効にせずにリスト項目を無効にするにはどうすればよいですか?

更新 あなたの答えでは、イベントをスキップしてみてください。これは多かれ少なかれクリーンで簡単に実行できることを私は知っています。しかし、保守性の問題から、プロパティ xaml ベースのソリューションをお勧めします (つまり、チェックボックスの画面領域を除く ListBoxItem のイベントを無効にするなど)。

4

1 に答える 1

1

チェックボックス コントロールには、チェックボックスの右側に、テキストやグラフィックなどを追加するためのコンテンツ領域があります。別のテキスト ブロックにテキストを設定する代わりに、チェックボックスの Conent タグを使用します。

<ComboBox.ItemTemplate>
    <DataTemplate>
        <CheckBox IsChecked="{Binding Path=EstaSeleccionado, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <TextBlock Text={Binding Path=Item.Value}/>
        </CheckBox>
    </DataTemplate>
</ComboBox.ItemTemplate>

注: Content タグを明示的に設定する必要はありません。Checkbox の開始タグと終了タグの間のコントロールが Content であると想定されます。

アップデート:

申し訳ありませんが、私はあなたの質問を誤解しました。あなたが見ている問題は、コンボボックスのデフォルトの動作がSelectionChangedにあるということです。それは、SelectedTextを新しくSelectedItemに設定することです。この動作を変更するには、次の 2 つのオプションがあります。

  1. バック コードで SelectionChanged イベント ハンドラーをオーバーライドし、SelectedText をプログラムで設定します。
  2. SelectedText を ViewModel のプロパティにバインドします。バインディングが値を変更しようとすると、プロパティでコンボボックス バインディングのソースを検査し、チェックされた項目から SelectedText 値を作成します。

次のようなオプション#2をお勧めします。

コード:

public class CheckItem // This probably should implement INotifyPropertyChanged
{
     public string Name { get; set; }
     public bool IsChecked { get; set; }
}


public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<CheckItem> ComboItems { get; set; }

    public string SelectedText 
    {
         get { return selectedText; }
         set { 
             StringBuilder sb = new StringBuilder();
             foreach (var item in ComboItems)
                 if (item.IsChecked)
                     sb.Append(String.Format("{0}; ", item.Name));
             selectedText = sb.ToString();
             // raise property changed here...
         }
    }
}

XAML:

 <ComboBox ItemsSource="{Binding Path=myViewModel.ComboBoxItems}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay>
                <TextBlock Text={Binding Path=Name}/>
            </CheckBox>
        </DataTemplate>
    </ComboBox.ItemTemplate>
 <Combobox/>

申し訳ありませんが、手元にコンパイラがないため、コンパイルできないものがあるかもしれません。

于 2012-04-16T17:19:19.603 に答える