Как динамично изменить ConverterParameter (или кто-либо) свойство MultiBinding (или кто-либо другой) ресурс во времени выполнения?

В чтении статьи Shawn Wildermuth Потоки WPF: Создайте Больше Быстро реагирующих Приложений С Диспетчером .

я приехал через следующее, которое указывает, что можно использовать Второстепенного Рабочего точно так же, как Вы могли в WindowsForms. Предположите что:

BackgroundWorker Теперь, когда у Вас есть смысл того, как Диспетчер работает, Вы могли бы быть удивлены знать, что Вы не найдете использование для него в большинстве случаев. В Windows Forms 2.0 Microsoft представила класс для обработки потока неUI для упрощения модели разработки для разработчиков пользовательского интерфейса. Этот класс называют BackgroundWorker. Рисунок 7 показывает типичное использование класса BackgroundWorker.

рисунок 7 Используя BackgroundWorker в WPF

BackgroundWorker _backgroundWorker = new BackgroundWorker();

...

// Set up the Background Worker Events
_backgroundWorker.DoWork += _backgroundWorker_DoWork;
backgroundWorker.RunWorkerCompleted += 
    _backgroundWorker_RunWorkerCompleted;

// Run the Background Worker
_backgroundWorker.RunWorkerAsync(5000);

...

// Worker Method
void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    // Do something
}

// Completed Method
void _backgroundWorker_RunWorkerCompleted(
    object sender, 
    RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        statusText.Text = "Cancelled";
    }
    else if (e.Error != null) 
    {
        statusText.Text = "Exception Thrown";
    }
    else 
    {
        statusText.Text = "Completed";
    }
}

компонент BackgroundWorker работает хорошо с WPF, потому что под покрытиями он использует класс AsyncOperationManager, который в свою очередь использует класс SynchronizationContext для контакта с синхронизацией. В Windows Forms, AsyncOperationManager руки прочь от класса WindowsFormsSynchronizationContext, который происходит из класса SynchronizationContext. Аналогично, в ASP.NET это работает с другой деривацией SynchronizationContext по имени AspNetSynchronizationContext. Эти SynchronizationContext-производные-классы знают, как обработать синхронизацию перекрестного потока вызова метода.

В WPF, эта модель расширяется с помощью класса DispatcherSynchronizationContext. При помощи BackgroundWorker Диспетчер нанимается автоматически для вызова вызовов метода перекрестного потока. Хорошие новости - то, что, так как Вы, вероятно, уже знакомы с этим общим шаблоном, можно продолжить использовать BackgroundWorker в новых проектах WPF.

5
задан abatishchev 20 April 2012 в 09:36
поделиться

1 ответ

Чтобы иметь возможность изменять режим отображения, используемый для каждого экземпляра, я бы сделал это примерно так:

  • Создайте UserControl с 3 TextBlock s для отображения трех частей имени.
  • Добавьте свойства к вышеупомянутым частям имени, которые будут целями привязки.
  • Добавьте свойство для режима, в котором следует отображать ( FirstNameFirst ], LastNameFirst и т. Д. )

Вышеупомянутое требует привязки для каждой части имени, поэтому один из способов упростить это - создать единственное свойство для UserControl типа NameData объявлена ​​как структура со свойствами First , Middle и Last . Тогда вы по-прежнему можете использовать одно MultiBinding для этого свойства. Разница будет в том, что ваш NameConverter возьмет 3 части и вернет новую структуру NameData вместо форматированной строки.

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />

<!-- and so on... -->

Идея состоит в том, чтобы отделить форматирование от данных.

Часть, которая спровоцировала сбой, объявляла один MultiBinding как ресурс. Как правило,

3
ответ дан 15 December 2019 в 06:32
поделиться
Другие вопросы по тегам:

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