gpt4 book ai didi

WPF ComboBox SelectedItem - 更改为以前的值

转载 作者:行者123 更新时间:2023-12-03 12:06:46 28 4
gpt4 key购买 nike

我有一个将 SelectedItem 绑定(bind)到 ViewModel 的 ComboBox。

<ComboBox SelectedItem="{Binding SelItem, Mode=TwoWay}" ItemsSource="{Binding MyItems}">

当用户在 View ComboBox 中选择一个新项目时,我想显示一个提示并验证他们是否要进行更改。

在 View 模型的 SetItem 属性 setter 中,我显示一个对话框来确认选择。当他们说是时,它工作正常。

我的问题是,当用户点击“否”时,我不确定谁会得到 ComboBox
恢复到以前的值。 ViewModel 中的属性具有正确的
旧值,但在 View 中,组合框显示新选择的值。

我希望用户选择一个项目,确认他们想要继续它,如果他们
决定不这样做,我希望 ComboBox 恢复到上一个​​项目。

我怎样才能做到这一点?
谢谢!

最佳答案

感谢您提出这个问题和答案。 Dispatcher.BeginInvoke 帮助了我,并且是我最终解决方案的一部分,但上述解决方案在我的 WPF 4 应用程序中并不完全有效。

我整理了一个小样本来找出原因。我必须添加实际上临时更改底层成员变量值的代码,以便当 WPF 重新查询 getter 时,它会看到值发生了变化。否则,UI 没有正确反射(reflect)取消,并且 BeginInvoke() 调用没有做任何事情。

Here's a my blog post我的示例显示了一个不工作和一个工作的实现。

我的二传手最终看起来像这样:

    private Person _CurrentPersonCancellable;
public Person CurrentPersonCancellable
{
get
{
Debug.WriteLine("Getting CurrentPersonCancellable.");
return _CurrentPersonCancellable;
}
set
{
// Store the current value so that we can
// change it back if needed.
var origValue = _CurrentPersonCancellable;

// If the value hasn't changed, don't do anything.
if (value == _CurrentPersonCancellable)
return;

// Note that we actually change the value for now.
// This is necessary because WPF seems to query the
// value after the change. The combo box
// likes to know that the value did change.
_CurrentPersonCancellable = value;

if (
MessageBox.Show(
"Allow change of selected item?",
"Continue",
MessageBoxButton.YesNo
) != MessageBoxResult.Yes
)
{
Debug.WriteLine("Selection Cancelled.");

// change the value back, but do so after the
// UI has finished it's current context operation.
Application.Current.Dispatcher.BeginInvoke(
new Action(() =>
{
Debug.WriteLine(
"Dispatcher BeginInvoke " +
"Setting CurrentPersonCancellable."
);

// Do this against the underlying value so
// that we don't invoke the cancellation question again.
_CurrentPersonCancellable = origValue;
OnPropertyChanged("CurrentPersonCancellable");
}),
DispatcherPriority.ContextIdle,
null
);

// Exit early.
return;
}

// Normal path. Selection applied.
// Raise PropertyChanged on the field.
Debug.WriteLine("Selection applied.");
OnPropertyChanged("CurrentPersonCancellable");
}
}

关于WPF ComboBox SelectedItem - 更改为以前的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585183/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com