8

次のデータ テンプレートがあります (および対応するビュー モデルは示されていません)。

<DataTemplate DataType="{x:Type logic:SnapshotListViewModel}">
    <ListBox ItemsSource="{Binding Snapshots}" />
</DataTemplate>

ItemsSource はビューモデル内にあるスナップショットのリストにバインドされています。私の目標は SelectedItem をクリアすることなので、リストボックスは最初の選択されていない状態に戻ります。ビュー モデルは IPropertyNotified を実装します。

次のように XAML にバインディングを追加しました。

<ListBox SelectedItem={Binding SelectedSnapshot} .... />

ビュー モデルで SelectedSnapshot = null を設定しましたが、プロパティで RaisePropertyChanged が呼び出されても何も起こりません。

SelectedItem の代わりに SelectedIndex を使用して再試行しました。まだ運がありません。

私は最終的に解決策を見つけました。これについては以下で詳しく説明します。

4

1 に答える 1

15

SelectedItem と SelectedIndex は忘れてください。答えはIsSynchronizedWithCurrentItem ="True"と共にSelectedValueです。

<ListBox IsSynchronizedWithCurrentItem="True" 
         SelectedValue="{Binding SelectedSnapshotValue}" .../>

次に、ビュー モデルで ResetSelection() を呼び出すと、SelectedSnapshotValue が null に設定されます。

void ResetSelection()
{
    SelectedSnapshotValue = null;
}

バインドされたプロパティを使用して、データ テンプレートのバインドを更新します。

    private SnapshotViewModel selectedSnapshotValue;
    public SnapshotViewModel SelectedSnapshotValue
    {
        get { return selectedSnapshotValue; }
        set
        {
            if (selectedSnapshotValue != value)
            {
                selectedSnapshotValue = value;
                RaisePropertyChanged("SelectedSnapshotValue");
            }
        }
    }

これが、リストボックスで選択をリセットできる唯一の方法です。

于 2013-05-07T22:09:48.273 に答える