2012-10-04 59 views
1

我有一个组合框的SelectedItem属性绑定到一个对象的字段。它使用TwoWay绑定,在大多数情况下工作正常;当它加载了,下拉的选择是从外地的吸气设定,手动更改选择调用该领域的引领者。WPF组合框 - 在绑定字段的setter改变选择 - 组合框选择不更新

但是,有时我想显示一个确认对话框。如果用户点击“否”,我希望该值保持不变。这里是我的代码:

public A Afield 
{ 
    get { return _afield; } 
    set 
    { 
     SetA(value); 
    } 
} 
public void SetA(LocationConfiguration value, bool prompt = true) 
{ 
    if (/*selection would cause irreversible changes*/) 
    { 
     if (prompt) 
     { 
      MessageBoxResult result = Microsoft.Windows.Controls.MessageBox.Show(
        "bla bla bla", 
        "bla", 
        MessageBoxButton.YesNo, 
        MessageBoxImage.Warning); 
      if (result != MessageBoxResult.Yes) 
       return; 
     } 
     PerformIrreversibleChanges() 
    } 
    _afield = value; 
    NotifyPropertyChanged("Afield"); 
} 

代码隐藏的一切工作完美。如果用户接受,则进行更改。如果用户按下“否​​”,则_afield不被修改。绑定到此属性的其他控件显示正确的值。

然而,在组合框显示不恢复到_afield的值。即使他们拒绝了变更,它仍然保留他们所选的内容。出于某种原因,它似乎没有设置组合框的项目,直到属性设置完成。此时它会显示用户选择的内容,而不是保留在代码隐藏中的正确值。

回答

0

您需要设置回因为双向绑定你的财产将得到尽快的选择更改,因此你需要,如果用户取消改变其重置为上一个值更新。您可以查看事件参数的RemovedItems属性以获取以前的值。

+0

定义了setter,如果用户取消该属性,属性永远不会被设置。但由于某些原因,即使属性保持正确的值,组合框仍显示用户尝试选择的值。 – hypehuman

0

我设法解决这个问题,但解决的办法是不漂亮。除了绑定,我现在有一个SelectionChanged事件改变选择回不管它应该是一个处理程序。下面的代码:

private void cbox_Abox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    foreach (ComboBoxItem cbi in cbox_Abox.Items) 
     if ((string)cbi.Content == BoundObject.Afield.ToString()) 
      cbox_Abox.SelectedItem = cbi; 
} 

现在,每当我手动选择组合框的值,它的价值通过绑定(就像它之前),然后,使用此处理程序,它会将值回了写入对象的对象放入ComboBox中。

出于某种原因,使用PropertyChanged事件在此不更新组合框,这就是为什么我必须显式调用ComboBox.SelectedIndex。

0

有无组A返回一个布尔

set 
{ 
    if (value == _afield) return;   
    if (SetA(value)) _afield = value; 
    NotifyPropertyChanged("Afield"); 
} 
+0

这不起作用:( – hypehuman

+0

我认为这可能是因为组合框中选定的项目没有设置,直到setter完成后,并且在setter期间调用NotifyProperty。 – hypehuman

+0

@hypehuman我同意 – Paparazzi

0

或者,你可以保存先前的值,并保持它作为后备如果用户因为我有办法压制“NO”

private A previousAfield; 
public A Afield 
{ 
    get { return _afield; } 
    set 
    { 
     previousAfield = _afield; 
     SetA(value); 
    } 
} 
+0

我不认为我解释了我的问题非常好。我并不需要存储一个备用的,因为_afield并最终有我想要的价值,问题是,组合框不显示值,这就是为什么我要专门设置的SelectedIndex。 – hypehuman

+0

最后给它cbx.SelectedItem = _previousAField –