2010-08-19 127 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屬性時的值。這可能會在啓動時掛起你的程序,因此你應該在構造函數中產生一個用於加載緩存屬性值的新線程。