14

へのListViewバインドがItemsSourceありSelectionChanged、ロード/データバインド イベントでイベントが発生していますか? 「デフォルト」アイテム、つまりインデックス0が選択されているためだと思います。

これを無効にするにはどうすればよいですか?

4

5 に答える 5

7

ItemsSourceプロパティのみを設定した場合、listViewはSelectionChangeを起動しないはずです。ただし、SelectedIndexプロパティをdataContextオブジェクトのプロパティにバインドすると、選択はバインドされたプロパティで指定されたインデックスに移動します。

これにより、ページが読み込まれたときにSelector_OnSelectionChangedイベントが発生しません。

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>

しかし、これはします:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  SelectedIndex="{Binding Path=SelectedIndexValue}"
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>

これは、SelectedIndexがバインディングによってSelecteIndexValueに設定されているためです。

これを回避し、マークアップでバインディングを維持するには、バインディングの前にdataContextオブジェクトのSelectedIndexValueを-1に設定します(フォームコンストラクターでInitializeComponent()が呼び出される前)。

お役に立てれば。

于 2009-09-02T23:29:32.637 に答える
1

回答ありがとうございます。

SelectionChangedイベントにブレークポイントを設定すると、画面が完全に読み込まれる前に、そこでの進行が中断されます。また、リストの最初の行が後で「選択」されていることもわかります。コードでわかるように、SelectedIndexValueにバインドしていません。リストのDataContextはReadonlyCollectionです

ご覧のとおり、SelectionChangedイベントでは、選択したアイテムに関連するデータをロードするように他のオブジェクトに通知します。これは、1つが選択されている場合にのみ発生し、デフォルトでは設定されないようにします。同様のデータを表すこれらのListViewを使用する必要がありますが、ロード時にアイテムを選択する必要はありません。

リストビューのプロパティウィンドウで、デフォルトの選択されたインデックスが-1に設定されていることに気付きました。これをList_Loadedイベントのコードに設定することもできますが、それまでに最初のSelectionChangedがすでに発生しています。

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
                     DataContext="{StaticResource ActiveCasesViewSource}"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource CasesItemTemplate}"
                     SelectionMode="Single"
                     SelectionChanged="ActiveCasesView_SelectionChanged"
                     ScrollViewer.CanContentScroll="True" 
                     ScrollViewer.VerticalScrollBarVisibility="Auto" >
</ListView>

private void ActiveCasesView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (mouseClicked)
            if (e.AddedItems.Count > 0)
                App.Messenger.NotifyColleagues(App.MSG_SELECT_ACTIVE_CASE, ((CaseViewModel)ActiveCasesView.SelectedItem).CaseNumber);
    }

PreviewMouseDownを追加して、SelectionChangedイベントのリストビューをクリックしたことを示すインジケーターを設定しました。これは役に立ちますが、私はそれが最善の解決策であるとは確信していません。

ありがとうペトルス

于 2009-09-03T08:35:54.570 に答える
1

これについてまだ助けが必要かどうかはわかりませんが、私の場合、選択されたインデックスを追跡する変数を作成することでこの問題を解決しました-最初にバインドされたときは常に0なので、少し簡単です.ビューモデルに適切なインデックスを通知します。私は単純に

ComboBox box = e.OriginalSource as ComboBox;
if (_previousIndex == cb.SelectedIndex) return;
//do stuff you need to do with a new SelectedIndex
于 2012-02-24T00:23:13.680 に答える
0

ウィンドウロードイベントを使用してアクションをブロックできます

bool loaded = false;

window.Loaded += new RoutedEventHandler(MainWindow_Loaded);

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
   windowLoaded = true;
}

private void ActiveCasesView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{

if(!loaded)
return ;

//do actions here ....

}
于 2010-08-08T16:07:19.397 に答える
0

バインディングで SelectedIndex プロパティを -1 に設定することもできますが、これも洗練された解決策ではありません。

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
                     DataContext="{StaticResource ActiveCasesViewSource}"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource CasesItemTemplate}"
                     SelectionMode="Single"
                     SelectionChanged="ActiveCasesView_SelectionChanged"
                     ScrollViewer.CanContentScroll="True" 
                     ScrollViewer.VerticalScrollBarVisibility="Auto" 
**SelectedIndex="-1"**>
</ListView>

私はあなたの行動を再現しようとしましたが、成功しませんでした。バインドしている ItemsSource コレクションの Type は何ですか?

于 2009-09-03T14:20:20.443 に答える