假设我在某个表单上有一个按钮,如果满足某些条件,我想要禁用该按钮。有没有办法在按钮的“IsEnabled”事件处理程序中检查这个条件并修改启用状态,以便第二次设置启用状态不会触发对IsEnabled事件处理程序的另一个调用?
让我演示一下:
private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e)
{
if (some condition)
{
uxExportResults.IsEnabled = false; // this will cause another call to the event handler, eventually resulting in a stack overflow
}
}
假设我在其他地方(我是)触发了这个事件。
答案 0 :(得分:4)
if (someCondition && uxExportResults.IsEnabled) { ... }
如果已启用,则只会禁用您的控件。
答案 1 :(得分:3)
另一种选择是暂时禁用事件:
private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e)
{
if (some condition)
{
uxExportResults.IsEnabledChanged -= ExportResults_IsEnabledChanged;
try
{
uxExportResults.IsEnabled = false; // this will cause another call to the event handler, eventually resulting in a stack overflow
}
finally
{
uxExportResults.IsEnabledChanged += ExportResults_IsEnabledChanged;
}
}
}
答案 2 :(得分:2)
最简单的解决方案是在设置之前检查IsEnabled的值。
private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e)
{
if (uxExportResults.IsEnabled == true)
{
uxExportResults.IsEnabled = false;
}
}
此外,如果您能够更改按钮的代码,IsEnabled不应发送事件,除非该值实际更改。
public bool IsEnabled
{
get { return isEnabled; }
set
{
if(isEnabled != value)
{
isEnabled = value;
IsEnabledChanged(this,args);
}
}
}