lambda 非静态 C#

lambda non static C#

我正在尝试使用 lambda 函数将操作处理程序动态绑定到 UWP 中的单选按钮:

private void populateMenu(ListBar lb)
{
    foreach (var item in lb.Groups)
    {
        leftMenuStackBar.Children.Add(ListBar.rbGrp(item));

        foreach (var LItem in item.Items)
        {
            var radioButton = ListBar.rb(LItem);
            radioButton.Click += (o, i) =>
            {
                loadFromMenuClick(LItem.Transl, frame);
            };

        leftMenuStackBar.Children.Add(radioButton);
    }
}

编译器说函数 "loadFromMenuclick" 必须是静态的。在这个函数中我想使用 Frame.Navigate 函数:

public void loadFromMenuClick(string test, Frame f)
{
    Frame.Navigate(typeof(Themes.AbstractView), test);
}

我给了它 "Frame f" 对象,因为我之前有这个错误,但是导航功能的工作方式,最好使用静态 Frame.Navigate 而不是 f.Navigate.

当我尝试使用 Frame.Navigate 时,出现 "An object reference is required for the non-static field, method or property 'Frame.Navigate(Type, object)'" 错误...

如何让它工作?

问题出在您的 "test" 字符串中。在您的事件处理程序被调用的那一刻,没有对 LItem.Transl 的引用。由于我们不知道该项目中的内容以及它如何链接到 RadioButton,我将假设 LItem.Transl 的字符串值也存储在 Tag 中继续我的回复] 属性 的 RadioButton。这是您附加事件处理程序的循环代码

var radioButton = ListBar.rb(LItem);
radioButton.Tag = LItem.Transl; // maybe this is in .Text as well?
radioButton.Click += (o, i) => loadFromMenuClick(o);

您的函数将是:

private void loadFromMenuClick(object sender)
{
    RadioButton radioButton = (RadioButton) sender;
    frame.Navigate(typeof (Themes.AbstractView), radioButton.Tag?.ToString());
}