c# - 绑定(bind)何时真正发生

标签 c# .net wpf

在弹出窗口上,我有一个绑定(bind)到模型的 checkbox.IsChecked ,但我想在显示窗口时从后面的 xaml 代码检查其状态。当在窗口加载事件后面的代码中按名称检查复选框时,它尚未设置。我需要做一些特定于 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/

相关文章:

wpf - 大声说 “ModelViewViewModel”或 “MVVM”太尴尬了!备择方案?

html - WPF:显示存储在资源程序集中的基于 HTML 的内容

c# - 加密 ASP.NET 连接字符串的正确方法是什么?

c# - 我可以在 Windows 8 操作系统上使用 C# 在 VS2010 上使用直接声音吗?

c# - 使用 C# 启动和停止服务

c# - 为什么不能在 .Net 的静态方法中使用关键字 'this'?

c# - 以编程方式更改 WPF 中的按钮图标

c# - EF + AutoFac + async "The connection' s 当前状态正在连接”

c# - SemaphoreSlim (.NET) 是否阻止同一线程进入 block ?

c# - 为什么这个线程方法需要 900 毫秒才能完成?