Wpf 强制数据绑定进行初始化
有没有什么方法可以在控件创建后立即强制对其初始化数据绑定 我的问题是,我创建了一个自己的UserControl派生控件,它必须在显示之前进行一些耗时的处理。更确切地说,使用.Net的MediaPlayer组件创建视频媒体的缩略图。我正在自定义菜单项控件中显示控件 当它现在工作时,控件在显示之前(当选择父菜单项时)被初始化,这将开始耗时的工作,并迫使我显示某种“处理项”信息,直到控件完成工作 我需要找到一种方法,使文件名的数据绑定在显示主窗口时立即执行,而不是在显示控件之前执行。可能吗 我创建了一个小应用程序来演示我的问题: Window1.xamlWpf 强制数据绑定进行初始化,wpf,data-binding,media-player,Wpf,Data Binding,Media Player,有没有什么方法可以在控件创建后立即强制对其初始化数据绑定 我的问题是,我创建了一个自己的UserControl派生控件,它必须在显示之前进行一些耗时的处理。更确切地说,使用.Net的MediaPlayer组件创建视频媒体的缩略图。我正在自定义菜单项控件中显示控件 当它现在工作时,控件在显示之前(当选择父菜单项时)被初始化,这将开始耗时的工作,并迫使我显示某种“处理项”信息,直到控件完成工作 我需要找到一种方法,使文件名的数据绑定在显示主窗口时立即执行,而不是在显示控件之前执行。可能吗 我创建了一
<Window x:Class="TestBinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style x:Key="MyMenuStyle" TargetType="MenuItem">
<Setter Property="Header" Value="{Binding MenuHeader}"/>
</Style>
</Window.Resources>
<Grid>
<Menu>
<MenuItem Header="Data">
<MenuItem Header="Submenus" ItemsSource="{Binding SubMenus}" ItemContainerStyle="{StaticResource MyMenuStyle}" />
</MenuItem>
</Menu>
</Grid>
</Window>
Window1.xaml.cs
using System.Collections.ObjectModel;
using System.Windows;
namespace TestBinding
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
DataContext = new BindingViewModel();
}
}
class BindingViewModel
{
public ObservableCollection<MyMenuItems> SubMenus { get; set; }
public BindingViewModel()
{
SubMenus = new ObservableCollection<MyMenuItems>();
SubMenus.Add(new MyMenuItems("Menu 1"));
SubMenus.Add(new MyMenuItems("Menu 2"));
SubMenus.Add(new MyMenuItems("Menu 3"));
}
}
public class MyMenuItems
{
private string _menuHeader;
public string MenuHeader
{
get
{
return _menuHeader;
}
set
{
_menuHeader = value;
}
}
public MyMenuItems(string header)
{
_menuHeader = header;
}
}
}
使用System.Collections.ObjectModel;
使用System.Windows;
命名空间测试绑定
{
公共部分类Window1:Window
{
公共窗口1()
{
初始化组件();
DataContext=新的BindingViewModel();
}
}
类BindingViewModel
{
公共ObservableCollection子菜单{get;set;}
公共绑定视图模型()
{
子菜单=新的ObservableCollection();
添加子菜单(新的MyMenuItems(“菜单1”);
添加子菜单(新的MyMenuItems(“菜单2”));
添加子菜单(新的MyMenuItems(“菜单3”);
}
}
公共类MyMenuItems
{
私人字符串(menuHeader);;
公共字符串菜单头
{
得到
{
返回(menuHeader);;
}
设置
{
_menuHeader=值;
}
}
公共MyMenuItems(字符串头)
{
_menuHeader=标题;
}
}
}
如果运行此程序并在该行上设置断点
return\u menuHeader您会注意到,当您选择父菜单项时,会执行此操作。
我希望程序在显示主窗口后尽快完成子菜单项的绑定,给程序一些时间来处理binding属性给出的值。您尝试过吗
绑定是从上到下进行处理的,因此请确保设置IsAsync属性(以异步运行这些绑定)-否则,它将在第一个绑定上挂起,直到完成,然后挂起第二个绑定,最后挂起第三个绑定,从而冻结过程中的UI。将绑定按最慢到最快的顺序(从上到下)放置,以便按该顺序启动它们
当返回值时,较高优先级的值将替换较低优先级的值(但如果“最慢”的值首先返回,则不是相反)。因此,我对问题的理解是(在您的示例中),MenuHeader get属性必须计算一些需要几秒钟时间的内容,在完成计算后是否返回
如果是这种情况,您可以在MyMenuItems的构造函数中进行复杂的计算,并在最终读取MenuHeader属性时缓存该值。这可能会在启动时挂起您的程序,因此您应该在构造函数中生成一个新线程来加载缓存属性值。谢谢您的建议,但这并不能解决我的问题。我添加了一些代码来说明我的问题。你还有什么想法吗?
<PriorityBinding>
<Binding Path="SlowestProperty" IsAsync="True" />
<Binding Path="MediumSpeedProperty" IsAsync="True" />
<Binding Path="FastestProperty" />
</PriorityBinding>