簡體   English   中英

如何檢測用戶是否更改了組合框選擇

[英]How to detect if Combobox selection is changed by user

我有一個DataGridColumn,它有一個組合框CellTemplate:

                 <dxg:GridColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox Name="DataItems"
                                      Width="120"
                                      HorizontalAlignment="Center"
                                      VerticalAlignment="Center"
                                      DisplayMemberPath="Value"
                                      ItemsSource="{Binding RowData.Row.DataDictionary}"
                                      SelectedValue="{Binding RowData.Row.Data}"
                                      SelectedValuePath="Key" />
                        </DataTemplate>
                    </dxg:GridColumn.CellTemplate>

我需要檢測用戶是否更改了組合框的初始值

如果使用SelectionChanged事件,則每次都會觸發(即使在創建時也是如此)。

該視圖是動態創建的,因此我不能真正使用bool值檢查它是剛剛創建還是已更改。

我應該使用什么事件或綁定來檢測用戶是否更改了選擇,而不發生了初始加載?

對我來說,我將使用OneWayToSource綁定。 通過將代碼置於句柄之后,您可能會知道:源由用戶或邏輯流程更改。

更改SelectedValue后將觸發SelectionChanged。 不在乎如何更新SelectedValue。 創建控件時,wpf通過從源代碼獲取操作來解析SelectedValue。 使用OneWayToSource綁定后,之后的代碼將不會更新SelectedValue。

在您的情況下,代碼應如下所示:

 public event EventHandler SelectedChangedByUser;
 public event EventHandler SelectedChangedByCode;

 public object SelectedValue
 {
   get
   {
         return _selectedVaue;
   }

   set
   {
    if(value != _selectedValue)
    {
        _selectValue = value;
        if(NotifyPropertyChanged != null)
        {
            NotifyPropertyChanged("SelectedValue");
        }   

        if(SelectedChangedByUser != null)
        {
            SelectedChangedByUser(this, new EventArgs());
        }
      }
    }
 }


  public void UpdateSelectedValue(object value)
  {
   if(value != _selectedValue)
   {
    _selectValue = value;   
    if(SelectedChangedByCode != null)
    {
        SelectedChangedByCode(this, new EventArgs());
    }
   }
  }

對我來說,簡單的解決方案是使用PropertyChanged事件。

它具有2個優點:

  • 它符合MVVM(我不將視圖與viewmodel混合使用)
  • 在構造完成后才觸發PropertyChanged(這基本上意味着僅顯式使用會得到通知)

這是代碼:

public DataItem FirstDataItem
   {
          get 
          { 
          return firstDataItem; 
          }
          set
          {
            firstDataItem= value;
            if (FirstDataItem!= null)
              FirstDataItem.PropertyChanged += (x, y) =>
              {
                if (y.PropertyName =="Data" )
                  DoSomething();
              };
          }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM