Предыдущие ответы полезны, но мне их было недостаточно. В конце концов я нашел потрясающую статью 2012 года в Руководстве разработчика по .Net 4.5 от Microsoft: Привязка свойства пользовательского действия к элементу управления конструктора . Эта статья была почти полным ответом - за исключением незначительной ошибки в пользовательском классе конвертера и серьезного недостатка: этот метод сохранит значение из ComboBox, но не восстановит его, когда вы снова откроете свой рабочий процесс.
Рон Джейкобс (Microsoft) предлагает другой ответ для разработчиков пользовательских заданий. В итоге я объединила их, чтобы получить рабочее решение.
Пользовательский конструктор
ModelToObjectValueConverter
был невероятно полезным ресурсом, позволившим мне пропустить создание моего IValueConverter
. В ObjectDataProvider
вы видите, как я загружаю список строк, вызывая статический метод People.GetPeople()
. ComboBox привязывается к этому провайдеру в качестве источника элемента, но привязывает выбранное значение к свойству Person в пользовательском действии (ниже)
<sap:ActivityDesigner x:Class="ActivityLibrary1.ComboBoxActivityDesigner"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
xmlns:sapc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation"
xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation"
xmlns:c="clr-namespace:ActivityLibrary1">
<sap:ActivityDesigner.Resources>
<ResourceDictionary>
<sapc:ModelToObjectValueConverter x:Key="ModelToObjectValueConverter" />
<ObjectDataProvider x:Key="people" ObjectType="{x:Type c:People}" MethodName="GetPeople"/>
</ResourceDictionary>
</sap:ActivityDesigner.Resources>
<Grid>
<Label Content="Person" HorizontalAlignment="Left" VerticalAlignment="Top" />
<ComboBox HorizontalAlignment="Left"
Margin="66,0,0,0"
VerticalAlignment="Top"
Width="120"
SelectedValue="{Binding Path=ModelItem.Person, Mode=TwoWay, Converter={StaticResource ModelToObjectValueConverter} }"
ItemsSource="{Binding Source={StaticResource people}}">
</ComboBox>
</Grid>
</sap:ActivityDesigner>
Код активности пользователя
Обратите внимание, что здесь используется свойство, а не InArgument, что облегчает привязку ComboBox.
[Designer(typeof(ComboBoxActivityDesigner))]
public class CodeActivity1 : CodeActivity
{
public string Person { get; set; }
protected override void Execute(CodeActivityContext context)
{
// Just to demonstrate that it worked
MessageBox.Show(Person);
}
}
Workflow
Теперь пользовательское действие, CodeActivity1
, можно перетащить в рабочий процесс. Когда вы сделаете выбор, выбранное значение появится на панели свойств. Сохраните рабочий процесс. Закройте и снова откройте. Ранее выбранное значение будет сохраняться по желанию.