2

リストボックスがあり、ユーザーが特定のタスクを完了していない場合にリストボックスの選択が変更されないようにしたいのですが、これが現時点で提供できる最良の説明です。WinForms では以前は選択の変更があり、キャンセル可能なイベント引数があります。選択を変更しても、トラップしてキャンセルすることができました。

リストボックスを継承して何かを行うと思っていましたが、内部的にセレクタークラスのすべての機能が隠されているため、リフレクターで確認できますが、メソッドを継承してオーバーライドする方法はありません!!

4

6 に答える 6

4

ListBox からクラス MyListBox を派生させ、キャンセル可能なイベントである SelectionChanging というイベントを追加しました。次に、Preview Left Mouse Up イベントを処理し、Selection Changing イベントを発生させる MyListBox の ItemContainer として MyListBoxItem を使用しました。キャンセル値で、イベントを処理済みとしてマークします。これにより、新しい選択が防止され、ユーザーに何かを行うように通知できます。

于 2010-06-21T07:50:58.273 に答える
1

ビューモデルクラスのプロパティにバインドIsSelectedし、プロパティのセッターでケースを処理します。例:

public bool IsSelected
{
   get { return _IsSelected; }
   set
   {
       if (value && DisableSelection)
       {
          AlertUser();
       }
       else
       {
          _IsSelected = value;
       }
       OnPropertyChanged("IsSelected");
   }
}

PropertyChangedビューの観点からは実際に変更されたため、プロパティが変更されていない場合でもイベントを発生させることに注意してください。

于 2010-05-10T17:36:36.037 に答える
0

これがあなたの質問に直接答えないことは知っていますが、ほとんどの場合(そうしない理由を確信する必要があります)、選択の基準が満たされるまで制御できないだけです。

この単純な手順により、値が変更されたことや、それが有効な変更であったかどうかなどを把握するための複雑さのほとんどが取り除かれます。コンボボックスを編集できるようにすると (値の入力など)、別のレベルの複雑さが追加されます。

それ以外の場合は、関連するディスカッションがあります: c# でコンボボックスの値の変更を防止/キャンセルする方法は?

于 2010-05-10T14:26:22.363 に答える
0

解決策の 1 つは、ユーザーが変更できるようになるまで ListBox と ListBoxItems をフォーカスできないようにすることです。これを実現した簡単なモックアップを次に示します。

XAML:

<StackPanel>
        <ListBox x:Name="LB">
            <ListBoxItem Focusable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=Focusable}"  Content="item 1"/>
            <ListBoxItem Focusable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=Focusable}" Content="item 2"/>
            <ListBoxItem Focusable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=Focusable}" Content="item 3"/>
            <ListBoxItem Focusable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=Focusable}" Content="item 4"/>
            <ListBoxItem Focusable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=Focusable}" Content="item 5"/>
            <ListBoxItem Focusable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=Focusable}" Content="item 6"/>
        </ListBox>
        <Button Content="Lock/Unlock" Click ="Button_Click"/>
    </StackPanel>

コード:

   private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (LB.Focusable == true)
            LB.Focusable = false;
        else
            LB.Focusable = true;
    }
于 2010-05-10T14:46:35.607 に答える
0

これはちょっとしたハックですが、リストボックスの PreviewMouseLeftButtonDown イベントを使用しただけです。

ハンドラーでは、ユーザーが離れたいと思っているかどうかをユーザーに尋ねなければなりませんでした。何らかの理由で、メッセージボックスをポップアップした後、e.handled を true としてマークするかどうかに関係なく、選択したイベントは発生しません。そのメッセージボックスに関する何かです。したがって、ユーザーがナビゲーションを確認した場合、マウスクリックを使用して、クリックされた対応するデータ項目を見つけ (ListBoxItem が見つかるまで VisualTreeHelper でループ)、その項目を手動で選択します。ユーザーが移動しないことを選択した場合は、e.handled を false に設定するだけです (ただし、メッセージボックスをポップアップしても同じ効果があるようです)。

于 2010-11-02T16:13:02.730 に答える