Wpf 强制数据绑定进行初始化

Wpf 强制数据绑定进行初始化,wpf,data-binding,media-player,Wpf,Data Binding,Media Player,有没有什么方法可以在控件创建后立即强制对其初始化数据绑定 我的问题是,我创建了一个自己的UserControl派生控件,它必须在显示之前进行一些耗时的处理。更确切地说,使用.Net的MediaPlayer组件创建视频媒体的缩略图。我正在自定义菜单项控件中显示控件 当它现在工作时,控件在显示之前(当选择父菜单项时)被初始化,这将开始耗时的工作,并迫使我显示某种“处理项”信息,直到控件完成工作 我需要找到一种方法,使文件名的数据绑定在显示主窗口时立即执行,而不是在显示控件之前执行。可能吗 我创建了一

有没有什么方法可以在控件创建后立即强制对其初始化数据绑定

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

当它现在工作时,控件在显示之前(当选择父菜单项时)被初始化,这将开始耗时的工作,并迫使我显示某种“处理项”信息,直到控件完成工作

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

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

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