如何检测用户是否更改了Combobox选择

时间:2015-04-21 20:23:46

标签: c# wpf

我有一个DataGridColumn,它有一个Combobox 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事件,它每次都会触发(即使在创建时)。

视图是以dinamically方式创建的,因此我无法真正使用 bool 值来检查它是刚创建还是被更改。

我应该使用什么事件或绑定来检测用户是否更改了选择而不是初始加载?

2 个答案:

答案 0 :(得分:2)

对我来说,我将使用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());
    }
   }
  }

答案 1 :(得分:2)

对我来说,简单的解决方案是使用 PropertyChanged 事件。

它有两个优点:

  • 符合MVVM(我不会将视图与视图模型混合)
  • 构造完成后,PropertyChanged仅在中被激活(这基本上意味着只有明确的使用被通知)

以下是代码:

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