2010-08-19 97 views
1

有什么办法可以强制数据绑定在创建后立即在控件上初始化?强制数据绑定初始化

我的问题是我创建了一个自己的UserControl派生控件,它必须在显示之前做一些耗时的处理。更确切地说,使用.Net的MediaPlayer组件创建视频媒体的缩略图。我在自定义的MenuItem控件中显示我的控件。

因为它现在起作用,控件在显示之前(当选择父MenuItem时)被初始化,这开始耗时的工作并迫使我显示某种“处理项目”信息,直到控件具有完成了这项工作。

我需要找到一种方法来让数据绑定的文件名在主窗口显示之后立即执行,而不是在显示我的控件之前。可能吗?

我创建了一个小的应用程序来证明我的问题:

Window1.xaml

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

如果你运行这个程序并在线上设置断点 return _menuHeader;您会注意到,这会在您选择父菜单项时执行。 我希望程序在显示主窗口后尽快完成子菜单项的绑定,并给程序一些时间来处理绑定属性给出的值。

回答

1

您是否试过PriorityBinding

<PriorityBinding> 
    <Binding Path="SlowestProperty" IsAsync="True" /> 
    <Binding Path="MediumSpeedProperty" IsAsync="True" /> 
    <Binding Path="FastestProperty" /> 
</PriorityBinding> 

的绑定处理从上到下,所以一定要设置isAsync属性(运行这些异步) - 否则,它只是在第一个挂起,直到完成,然后在第二个,最后是第三个,在这个过程中冻结用户界面。按照最快的顺序(从上到下)将绑定放在最慢的位置,以便按顺序将其绑定。

当返回值时,优先级较高的值会取代较低的优先级值(但是,如果“最慢”的值首先返回,则不会相反)。

+0

谢谢你的建议,但这并不能解决我的问题。我已经添加了一些代码来解决我的问题。你有更多的想法吗? – 2010-08-23 06:20:28

0

因此,我所了解的问题(在你的例子中)MenuHeader的get属性将不得不计算一些将需要几秒钟,然后返回完成计算后返回?

如果是这种情况,你可以做的是在MyMenuItems的构造函数中做复杂的计算,并缓存最后读取MenuHeader属性时的值。这可能会在启动时挂起你的程序,因此你应该在构造函数中产生一个用于加载缓存属性值的新线程。