在弹出窗口中,我有checkbox.IsChecked
绑定到模型,但我想在显示窗口时从后面的xaml代码检查其状态。当从Windows加载事件后面的代码中按名称检查复选框时,它尚未设置。我需要做一些UI特定的事情,这就是为什么我需要知道窗口打开时复选框值是什么,我无法从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 codebehind中的事件:
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
}
}
}));
}
答案 0 :(得分:3)
数据绑定不是同步完成的,但会延迟。检查调度程序优先级的this msdn page。它的执行优先级低于普通窗口消息,但在渲染之前。
您可以使用比数据绑定定义更低的优先级调用自己的方法,在此方法中,您应该能够安全地读取数据绑定值。
我仍然觉得这很难看。我宁愿直接订阅PropertyChanged
并检查此属性,甚至更好,重写您的&#34; UI相关代码&#34;作为数据绑定。
P.S。如果您开始使用事件,请务必取消订阅,否则可能会导致内存泄漏。
答案 1 :(得分: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));
}
}