1

私の DataGrid の SelectedItem は、以下のプロパティにバインドされています。

public OrderItemViewModel SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if (_selectedItem != value)
        {
            _selectedItem = value;
            OnPropertyChanged(() => SelectedItem);

            if (_selectedItem != null && _isReturnMode)
            {
                if (_selectedItem.OrderItemModel.ProductDetails.IsConstructed)
                {
                    VisiblePaymentViewModel = new ViewReturnComponentsViewModel(this, value.OrderItemModel.ProductDetails);
                }
                else
                {
                    VisiblePaymentViewModel = new EditReturnItemViewModel(this, value);
                }
                SelectedItem = null;
            } 
        }
    }
}

DataGrid の ItemsSource はバインドされています

public ICollectionView VisibleOrderItems { get; set; }

プログラムで SelectedItem をリセットしたい理由は、これがタッチ スクリーン アプリケーションであり、アイテムを選択したときにビューを変更し、データグリッドでビューに戻ったときに変更したいからです。アイテムを選択したくない。

SelectedItem をクリアするだけの別の関数を作成し、別のビューが終了したときにそれを呼び出すことを試みました。また、さまざまなバインディング設定を試しました.... UpdateSourceTrigger=PropertyChanged、Mode=TwoWay、IsSynchronizedWithCurrentItem

なぜこれがうまくいかないのか、頭を悩ませることはできません。

DataGrid は行をハイライト表示しますが、その行をクリックすると _selectedItem ( _selectedItem != value)が設定されます

4

3 に答える 3

1

VisibleOrderItems.CurrentItem = null を設定してみましたか?

また、現在の項目と選択された項目には違いがあります。現在の項目は ICollectionView の CurrentItem プロパティを占めている項目であり、SelectedItems はいずれかの方法で現在選択されているすべての項目のセットです。現在の項目を選択する必要はありません。

于 2012-10-22T16:05:05.763 に答える
0

私のプロジェクトの1つで、私はあなたとまったく同じ問題を抱えており、以下の非常にハックな解決策を実行しました。xml では -NotifyOnSourceUpdated=True重要です!:

      <DataGrid ItemsSource="{Binding Items}" 
SelectedItem="{Binding SelectedItem, Mode=TwoWay, NotifyOnSourceUpdated=True}">

viewmodel プロパティでは、以下のコードのようになります。コードには if 条件が含まれていないことに注意してください。ただし、十分に明確であると確信しています。

    public TestModel SelectedItem
    {
        get { return selectedItem; }
        set
        {
            selectedItem = value;

            if (selectedItem != null)
            {
                //.....do something with selected item

                //actual hack, execute SelectedItem = null async on UI thread
System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke((ThreadStart)(() =>
                 {
                     SelectedItem = null;
                 }));
             }
             else
             {
                 OnPropertyChanged("SelectedItem");
             }               
        }
    }
于 2012-10-22T19:43:12.283 に答える
0
if (_selectedItem != value)
        {
            _selectedItem = value;

            if (_selectedItem != null && _isReturnMode)
            {
                if (_selectedItem.OrderItemModel.ProductDetails.IsConstructed)
                {
                    VisiblePaymentViewModel = new ViewReturnComponentsViewModel(this, value.OrderItemModel.ProductDetails);
                }
                else
                {
                    VisiblePaymentViewModel = new EditReturnItemViewModel(this, value);
                }
                SelectedItem = null;
            } 
             OnPropertyChanged(() => SelectedItem);
        }

if ブロックの最後に Notify を設定します。

于 2012-10-22T16:20:34.827 に答える