Принудительная привязка данных для инициализации

Есть ли способ принудительно инициализировать привязки данных в элементах управления сразу после их создания?

Моя проблема что я создал собственный производный элемент управления UserControl, который должен показывать много времени, прежде чем он будет показан. Точнее, создавайте миниатюры видео-медиа, используя компонент MediaPlayer .Net. Я отображаю свой элемент управления в пользовательском элементе управления 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
задан The Squirrel 23 August 2010 в 06:19
поделиться

1 ответ

Вы пробовали PriorityBinding?

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

Биндинги обрабатываются сверху вниз, поэтому не забудьте установить свойство IsAsync (чтобы выполнять их асинхронно) - иначе он просто зависнет на первом до завершения, затем на втором, и наконец на третьем, заморозив UI в процессе. Расположите привязки в порядке от самой медленной к самой быстрой (сверху вниз), чтобы запускать их в таком порядке.

По мере возврата значений, значения с более высоким приоритетом заменяют значения с более низким приоритетом (но не наоборот, если "самый медленный" возвращается первым).

2
ответ дан 2 September 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: