gpt4 book ai didi

c# - 将变量从 ViewModel 传递到另一个 View (MVVMCross)

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:02:46 24 4
gpt4 key购买 nike

在过去的几周里,我一直致力于使用 MVVMCross 框架开发跨平台应用程序 (IOS/Android/WP7)。今天我遇到了一个我真的不知道如何解决的问题,所以希望你能把我推向正确的方向。

在 IOS 中,我有以下用于导航到另一个页面的结构(下面的代码位于 ViewModel 中):

KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5");

public IMvxCommand BeckhoffActuator1
{
get
{
return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1));
}
}

当触发此 IMvxCommand(按下按钮)时,将加载下一个 View ,在本例中为 BeckhoffActuatorViewModel。在 BeckhoffActuatorView 的代码中,我使用了上面的键值对:

public class BeckhoffActuatorView : MvxTouchDialogViewController<BeckhoffActuatorViewModel>
{

ICollection<string> icol;

public BeckhoffActuatorView(MvxShowViewModelRequest request) : base(request, UITableViewStyle.Grouped, null, true)
{

icol = request.ParameterValues.Values;

}

public override void ViewDidLoad()
{
//Code
}
}

这种构造在 IOS 中运行良好,但我想在我的 android 应用程序中使用相同的构造。

ViewModel 中的代码没有改变,因为那是 MVVM 的全部思想。但是 BackhoffActuatorView 的代码对于 Android 是不同的:

public class BeckhoffActuatorView : MvxBindingActivityView<BeckhoffSensorViewModel>
{
public ICollection<string> icol;

public BeckhoffActuatorView()
{
Debug.WriteLine("Standard");
}

public BeckhoffActuatorView(MvxShowViewModelRequest request)
{
Debug.WriteLine("Custom");

icol = request.ParameterValues.Values;
}

protected override void OnViewModelSet()
{

SetContentView(Resource.Layout.BeckhoffActuatorView);

}
}

上面的代码不起作用,MvxBindingActivityView 似乎没有实现类似于我在 IOS 中使用的 ViewController 的东西。代码只出现在标准构造函数中,当我完全离开它时,它不会编译/运行。

有谁知道我可以访问我用 RequestNavigate 发送的键值对吗?谢谢!

最佳答案

MVVMCross 非常基于约定 - 它致力于尽可能在 ViewModel 之间传递消息的想法。

如果您使用以下方式导航到 ViewModel:

KeyValuePair<string,string> kvpAct1 = new KeyValuePair<string, string>("short", ".countertest5");

public IMvxCommand BeckhoffActuator1
{
get
{
return new MvxRelayCommand<Type>((type) => this.RequestNavigate<Beckhoff.BeckhoffActuatorViewModel>(kvpAct1));
}
}

那么您应该能够使用构造函数在 BeckhoffActuatorViewModel 中获取它:

public class BeckhoffActuatorViewModel : MvxViewModel
{
public BeckhoffActuatorViewModel(string short)
{
ShortValue = short;
}

private string _shortValue;
public string ShortValue
{
get
{
return _shortValue;
}
set
{
_shortValue = value;
FirePropertyChanged("ShortValue");
}
}
}

然后您的 View 可以访问ViewModel.ShortValue (iOS 可以在 base.ViewDidLoad() 之后完成,Android 可以在 OnCreate() 之后完成,WP7 可以在 OnNavigatedTo 之后完成)

有关这方面的示例,请查看 TwitterSearch 示例:

这有一个调用导航的 HomeViewModel:

    private void DoSearch()
{
RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });
}

和一个使用构造函数接收 searchTerm 的 TwitterViewModel:

    public TwitterViewModel(string searchTerm)
{
StartSearch(searchTerm);
}

请注意只有 string目前允许在此消息传递中使用 s - 但您始终可以使用 JSON.Net 序列化您自己的对象 - 或者您可以扩展框架 - 它是开源的。

请注意只有string小号,int小号,double s 和 bool目前允许在此构造函数参数中传递 - 这是由于 Xaml Urls 和 Android Intents 的序列化要求。如果您想尝试使用您自己的自定义序列化对象进行导航,请参阅 http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html .

另请注意,如果您想使用匿名对象导航 (RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText });),则需要确保 InternalsVisibleTo属性已设置 - 请参阅 https://github.com/slodge/MvvmCrossTwitterSearch/blob/master/TwitterSearch.Core/Properties/AssemblyInfo.cs :

[assembly: InternalsVisibleTo("Cirrious.MvvmCross")]

进一步......不适合胆小的人......这不是“好的mvvm代码”......但是如果你真的想要/需要访问Android Activity 中的MvxShowViewModelRequest数据,那么你可以提取它来自传入的 Intent - 有一个包含请求的 Extras 字符串(请参阅 CreateViewModelFromIntent 中的反序列化 https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Views/MvxAndroidViewsContainer.cs )

关于c# - 将变量从 ViewModel 传递到另一个 View (MVVMCross),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10192505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com