【问题标题】:Force databinding to initialize强制数据绑定初始化
【发布时间】:2010-08-19 13:06:22
【问题描述】:

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

我的问题是我创建了一个自己的 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; 你会注意到它在你选择父菜单项时执行。 我希望程序在显示主窗口后尽快完成子菜单项的绑定,给程序一些时间来处理绑定属性给出的值。

【问题讨论】:

    标签: wpf data-binding media-player


    【解决方案1】:

    你试过PriorityBinding吗?

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

    绑定是从上到下处理的,所以一定要设置 IsAsync 属性(以异步方式运行) - 否则,它只会挂在第一个上直到完成,然后挂在第二个上,最后是第三个一、冻结过程中的UI。将绑定按从最慢到最快的顺序(从上到下)按该顺序启动。

    在返回值时,较高优先级的值会替换较低优先级的值(但不是相反,应该“最慢”的值首先返回)。

    【讨论】:

    • 感谢您的建议,但这并不能解决我的问题。我添加了一些代码来演示我的问题。你还有什么想法吗?
    【解决方案2】:

    所以我理解的问题是(在您的示例中)MenuHeader get 属性必须计算一些需要几秒钟的时间,然后在完成计算后返回?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多