列出函数列表
本文关键字:列表 函数 | 更新日期: 2023-09-27 18:00:49
在我的视图模型中,我有一些数学函数,如加法、减法。在我的用户界面中,我有两个文本框,其中包含一个输入,然后是一个组合框。此组合框将包含所有数学函数(加法、减法(的名称。在"确定"按钮上,我希望执行所选的功能。我怎么能做到这一点。我的意思是如何在组合框中显示函数名称列表?我可以在那里显示字符串,但函数名称如何。以及选定的功能。
<ComboBox ItemsSource="{Binding Actions}" SelectedItem="{Binding SelectedAction}" />
查看模型
public IEnumerable<string> Actions
{
get
{
var list = new List<string>();
list.Add("Add"); // Instead of adding strings, I want to add functions.
list.Add("Subtract");
return list;
}
}
public int AddFunction()
{
return numberA + numberB;
}
public int SubtractFunction()
{
return numberA - numberB;
}
下面的例子可能会有所帮助:
待办事项:1.结果应绑定到UI中的另一个文本块2.ComboBox_SelectionChanged应通过ICommand完成。参考:mvvm绑定树视图项更改为icommand
public IList<MyComboboxItem> Actions
{
get
{
var list = new List<MyComboboxItem> { new MyComboboxItem(AddFunction), new MyComboboxItem(SubtractFunction) };
return list;
}
}
public int numberA { get; set; }
public int numberB { get; set; }
public int Result { get; private set; }
public void AddFunction()
{
Result = numberA + numberB;
}
public void SubtractFunction()
{
Result = numberA - numberB;
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var comboboxItem = e.AddedItems[0] as MyComboboxItem;
if (comboboxItem != null)
comboboxItem.Action.Invoke();
}
public event PropertyChangedEventHandler PropertyChanged;
public class MyComboboxItem
{
public Action Action { get; private set; }
public MyComboboxItem(Action action)
{
this.Action = action;
}
public override string ToString()
{
return Action.Method.Name;
}
}
因此,您想要的是一个委托列表,然后是一个将委托转换为方法名称的转换器。
在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;
}
}
接下来,实现一个转换器。通常,转换器是"视图"的一部分,因此将其放入代码隐藏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。反射属性它什么都没有。如果您想添加诸如"标签"、"说明"等参数,您可以
- 用`[PPresentating]装饰组合框中所需的方法`
- 现在,Actions使用反射。请注意筛选器谓词的"Where"和lambda,它只返回具有自定义属性的方法
- 您必须修改转换器才能获取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;
}
}
}