4

OK、これは重複した質問である必要がありますが、答えが見つかりません。コレクションにデータバインドされたリストボックスがあります。デフォルトでは、Items[0]が選択されています。ListBoxItemをクリックするたびにSelectionChangedイベントが発生するようにするには、これを防ぐにはどうすればよいですか?

編集:SelectedIndex = -1ルートを既に却下しましたが、再試行しました:リストボックスのコンストラクターで(またはXAMLの属性として)SelectedIndexを-1に設定しても機能しません。初期化後にリストボックスにデータが入力され、selectedindexは結局0になるようです。SelectedItemをnullに設定するのと同じ話です。

私はこれを試しました:

<ListBox ItemsSource="{Binding Value}" 
         SelectionChanged="ListBox_SelectionChanged"
         IsSynchronizedWithCurrentItem="True"
         Loaded="ListBox_Loaded">
</ListBox>

と:

 private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if(e.AddedItems.Count==0)return;//Prevents stackoverflow! ;-)
        ((ListBox)e.OriginalSource).SelectedItem=null;
    }

private void ListBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ListBox) sender).SelectedItem = null;
}

これは機能しますが、リストボックスに表示される項目の上に空白行が挿入されます。これは非常に醜いです。私の特定のケースでは、IsSynchronizedWithCurrentItem属性を削除することで問題を解決できます。

しかし、これが受け入れられない多くのシナリオを考えることができます。

上記のステートメントは意味がありません。マスター/詳細バインディングを使用してIsSynchronizedWithCurrentItemをtrueに設定するか、そうでないかのどちらかです。マスター/詳細バインディングを使用して、リストボックスに現在選択されているアイテムがないことはほとんどありません。

4

7 に答える 7

6

いくつかのテストを実行した後、ListBoxのデフォルトの動作は、リスト内の項目を事前に選択しないことです。IsSynchronizedWithCurrentItem = "True"を削除すると、リストボックスが事前に選択された状態で開始されず、ユーザーがアイテムをクリックしたときにSelectionChangedイベントが発生します。

IsSynchronizedWithCurrentItemをtrueに設定すると、selectedIndexは常にListBox.ItemsのListBox.Items.CurrentItemのインデックスと等しくなります。ListBox.Itemsには常にCurrentItemがあり、CurrentItemまたはCurrentIndexが読み取り専用であるため、-1またはnullに設定することはできません。

それがJを助けることを願っています

編集...読んだばかり

「私の特定のケースでは、IsSynchronizedWithCurrentItem属性を削除することで問題を解決できました。しかし、これが受け入れられない多くのシナリオを考えることができます。」

その場合、上記の理由でそれは不可能だと思います。

于 2009-11-29T18:41:09.597 に答える
2
listbox.selectedIndex = -1

これですべての選択が解除されます(インデックス-1が存在しないため)が、デフォルトのselectedItemを明示的に設定しない限り、リストビューは何も選択されていない状態で生成されるため、SelectedIndexが誤ってに設定されている可能性があります。いくつかのポイント。SelectedIndexはXAMLでも設定できることに注意してください。

于 2009-11-24T14:42:36.040 に答える
2

リストボックスのItemsSourceとしてCollectionViewを使用します。最初にアイテムが選択されていない新しいWPFプロジェクト:

XAML:

<Window x:Class="ListBoxDataBinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <ListBox 
        ItemsSource="{Binding Path=Value, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" 
        SelectionChanged="ListBox_SelectionChanged"
        IsSynchronizedWithCurrentItem="True"
        >
    </ListBox>
</Grid>
</Window>

cs:

public partial class Window1: Window {
    public IEnumerable Value {
        get { return (IEnumerable)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(IEnumerable), typeof(Window1), new UIPropertyMetadata(null));


    public Window1() {
        InitializeComponent();
        var view = new TheCollectionView();
        view.MoveCurrentTo(null);
        this.Value = view;
    }

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {
        MessageBox.Show("Selection changed");
    }
}

public class TheCollectionView: CollectionView {
    public TheCollectionView(): base(new TheCollection()) {
    }
}

public class TheCollection: List<string> {
    public TheCollection() {
        Add("string1");
        Add("string2");
        Add("string3");
    }
}
于 2009-11-29T18:58:09.247 に答える
1

インデックスを-1に設定する必要があります。これにより、リストボックスに何も選択しないように指示されます。SelectionChangedイベントで、リストボックスのIndexプロパティを-1に設定します。

これがお役に立てば幸いです、よろしく、トム。

于 2009-11-24T14:36:18.830 に答える
1

代わりに、SelectionChangedイベントハンドラーとデータバインディングをダンプして、依存関係プロパティをダンプしたり、プロパティをSelectedValueに通知したりするのはどうですか?

于 2009-11-27T00:11:35.077 に答える
1

リストボックスのプロパティに移動するだけです。[データ]タブを選択してから、[バインドされた列]を選択します。-1を入力します。このエントリは自動的に65535に変更されます。

次に、[値リストの編集を許可]プロパティを[いいえ]に変更します。最後に、[ロック]プロパティを[いいえ]に変更します。

これで、ユーザーはリスト内のアイテムを選択できなくなり、アイテムの逆方向のビデオが回避されます。

于 2020-07-14T16:11:14.587 に答える
0

SelectionChangedの代わりにTapイベントを使用できます。

<ListBox  ItemsSource="{Binding Data}" Tap="ListBox_Tap" ... />
于 2013-06-20T16:17:54.197 に答える