Так что вы хотите, чтобы иметь список делегатов, а затем конвертер, который преобразует делегата в название метода.
В вашей модели ViewModel свойство Actions возвращает список делегатов. Используйте предопределенный Func, который является методом, который не принимает аргумент и возвращает int:
public IEnumerable<Func<int>> Actions
{
get
{
List<Func<int>> list = new List<Func<int>>();
list.Add(AddFunction);
list.Add(SubstractFunction);
return list;
}
}
Далее следует использовать преобразователь. Как правило, конвертер является частью «View», поэтому поместите его в код, расположенный за файлом cs. Это преобразование конвертировать Func<int>
в строку, и она использует отражение, чтобы сделать это:
[ValueConversion(typeof(Func<int>), typeof(string))]
public class FnConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Func<int> fn = value as Func<int>;
return fn.Method.Name;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
Наконец, необходимо использовать преобразователь в XAML. Но для этого вам нужно указать шаблон элемента в поле со списком, в котором применяется конвертер.
<!-- earlier in code define the converter as a resource -->
<Window.Resources>
<src:FnConverter x:Key="conv" />
</Window.Resources>
...
<!-- now the combo box -->
<ComboBox Margin="4" ItemsSource="{Binding Path=Actions}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=., Converter={StaticResource conv}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Говоря это, я думаю, что еще более элегантным решением было бы сохранить список MethodInfo в модели представления. Создайте этот список с помощью настраиваемого атрибута. Ниже некоторого кода. Обратите внимание на следующие пункты:
- PresentingAttribute - это настраиваемый атрибут. Это происходит из System.Reflection.Attribute. У него ничего нет. Если вы хотите добавить такие параметры, как «Ярлык», «Описание» и т. Д.
- Украсьте методы, которые вы хотите в поле со списком, с помощью `[Presenting]`
- Теперь в действиях используется отражение. Обратите внимание на «Где» и лямбда для предиката фильтра, который возвращает только те методы, которые имеют наш пользовательский атрибут.
- Вам нужно будет изменить конвертер, чтобы получить MethodInfo.
namespace SO
{
class PresentingAttribute : Attribute
{
}
class FnVM
{
public int numA { get; set; }
public int numB { get; set; }
public IEnumerable<MethodInfo> Actions
{
get
{
return typeof(FnVM).GetMethods().Where(minfo =>
minfo.GetCustomAttribute(typeof(PresentingAttribute)) != null
);
}
}
[Presenting]
public int AddFunction()
{
return numA + numB;
}
[Presenting]
public int MulFunction()
{
return numA * numB;
}
}
}
Вы хотите добавить функции в файле 'ComboBox' или имена функций? то есть. 'string's. – Guillaume
На самом деле имена функций. В этом случае поле со списком будет содержать AddFunction, SubtractFunction. –
Простыми словами это должно быть так, что я выбираю функцию из поля со списком и затем ОК. В OK нажмите, я не проверяю, что такое значение поля combox. Я просто делаю, что selectedAction.Exceute (или что-то вроде этого). Я не хочу, если else проверяет, что, если строка boxox добавляется, тогда выполните это, сделайте это. –