gpt4 book ai didi

c# - 绑定(bind)什么时候真正发生

转载 作者:行者123 更新时间:2023-11-30 20:59:58 28 4
gpt4 key购买 nike

在弹出窗口中,我有一个绑定(bind)到模型的 checkbox.IsChecked,但我想在显示窗口时从后面的 xaml 代码中检查它的状态。当从 Windows 加载事件的代码中按名称检查复选框时,它尚未设置。我需要做一些特定于 UI 的事情,这就是为什么我需要知道窗口打开时复选框的值是什么,而我无法从 checkbox.IsChecked 绑定(bind)到的模型执行此操作。

模型的属性在弹出窗口打开之前很久就设置好了,所以这不是绑定(bind)不存在的问题。我认为一旦 Loaded 事件触发,窗口就会准备好使用绑定(bind)等等,但事实似乎并非如此。

Xaml:

<RefinedRibbonControls:RefinedRibbonGroup Header="Show Graphs">
<StackPanel x:Name="panelVisibilities">
<CheckBox Content="Show/hide" x:Name="myCheckBox"
IsChecked="{Binding Path=Processor.Model.IsItemVisible}"
Click="GraphVisibilityClickEvent"
HorizontalAlignment="Left"/>
...etc

模型属性:

public bool IsItemVisible
{
get { return _isItemVisible ; }
set
{
if (_isItemVisible != value)
{
_isItemVisible = value;
_propertyChanger.FirePropertyChanged(this, m => m.IsItemVisible);
}
}
}

Xaml 代码隐藏中的事件:

private void WindowLoadedEvent(object sender, RoutedEventArgs e)
{
if(myCheckBox.IsChecked.Value)
{
// Do UI Related Stuff
}
}

绑定(bind)工作正常,显示窗口时显示值,问题是我无法在窗口加载事件中获取绑定(bind)的值。

编辑:我找到了可能的解决方案,但我不确定它是否是最好的方法。我从后面的 xaml 代码的构造函数中调用了以下方法。

private void SetupInitialVisibility()
{
//Fire after everything is loaded.
Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() =>
{
IEnumerable<CheckBox> elements = this.panelVisibilities.Children.OfType<CheckBox>().ToList();
foreach (CheckBox checkBox in elements)
{
if (checkBox.IsChecked != null && checkBox.IsChecked.Value == false)
{
//Do work
}
}


}));
}

发现于:https://stackoverflow.com/a/1746975/1253746

最佳答案

数据绑定(bind)不是同步完成的,而是有延迟的。检查this msdn page关于调度员的优先级。它以比普通窗口消息更低的优先级完成,但在渲染之前。

您可以调用自己的方法,其优先级低于为数据绑定(bind)定义的优先级,在此方法中您应该能够安全地读取数据绑定(bind)值。

我仍然会觉得这很难看。我宁愿直接订阅 PropertyChanged 并检查此属性,或者更好的是,将您的“UI 相关代码”重写为数据绑定(bind)。

附言如果您开始消费事件,请务必取消订阅,否则您可能会发生内存泄漏。

关于c# - 绑定(bind)什么时候真正发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233278/

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