2013-03-05 106 views
2

在弹出的窗口中我绑定了一个checkbox.IsChecked模型,但是我希望从窗口显示时的xaml代码后面检查它的状态。在Windows加载事件后面的代码中通过名称检查复选框时,它尚未设置。我需要做一些特定于UI的事情,这就是为什么我需要知道窗口打开时checkboxes的值是什么,而且我无法从checkbox.IsChecked绑定的模型中执行此操作。什么时候绑定实际发生

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

的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 
      } 
     } 

的结合工作正常和值出现在显示窗口,问题是我无法获得窗口加载事件中绑定的值。

编辑:可能的解决方案我找到了,但我不确定它是否是最好的方法。 我在后面的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

+0

发布您的代码和XAML – 2013-03-05 20:18:48

+0

提供代码.... – Dom 2013-03-05 20:32:29

+0

已提供代码。 – 2013-03-05 20:33:53

回答

2

数据绑定不同步完成,但它被延迟。关于调度程序优先级,请检查this msdn page。它的执行优先级低于正常的窗口消息,但在渲染之前。

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

我仍然会发现这个丑陋。我宁愿直接订阅PropertyChanged并检查此属性,或者甚至更好,将“UI相关代码”重写为数据绑定。

P.S.如果您开始使用事件,请务必取消订阅,否则可能会发生内存泄漏。

+0

我对原始问题添加了一个可能的解决方案。我不认为这可能导致内存泄漏..意见? – 2013-03-05 22:11:23

+0

不可以。只有您的意见订阅了活动,这是我建议的替代解决方案。 – 2013-03-05 22:13:44

0

DataBinding应该在我认为的Loaded事件之前。

何时以及如何设置DataContext?你肯定viewmodel属性已经设置好了吗?

以下工作,尽可能将您的代码与此对齐。

的XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.DataContext> 
     <local:ViewModel /> 
    </Window.DataContext> 
    <Grid> 
     <CheckBox x:Name="myCheckBox" IsChecked="{Binding IsItemVisible}" /> 
    </Grid> 
</Window> 

代码背后:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.Loaded += MainWindow_Loaded; 
    } 

    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (myCheckBox.IsChecked.Value) 
     { 
      //... 
     } 
    } 
} 

视图模型:

public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private bool isItemVisible; 
    public bool IsItemVisible { get { return isItemVisible; } set { isItemVisible = value; OnPropertyChanged("IsItemVisible"); } } 


    public ViewModel() 
    { 
     this.IsItemVisible = true; 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

enter image description here

相关问题