gpt4 book ai didi

c# - 使用 MVVM 模式时如何处理 MessageBox 对话框(MVVM Light ToolKit)

转载 作者:行者123 更新时间:2023-12-03 10:13:33 25 4
gpt4 key购买 nike

我正在制作 Windows Phone 7 并尝试使用 MVVM 来完成它。我想尽可能保持我的 View 模型干净,但我不确定如何制作对话框。我正在使用 MVVM light,我知道他们有消息系统或其他东西,但不确定如何使用它。

我想使用 Guide.BeginShowMessageBox,因为它似乎提供了比标准对话框更多的功能。

如何在不破坏 MVVM 模式的情况下执行此操作。当我加载 View 时,我想触发一个加载的触发器,然后检查一些条件。如果满足条件,则显示对话框。

//虚拟机

public RelayCommand MainPageLoaded
{
get
{
if (!NetworkInterface.GetIsNetworkAvailable())
{
// breaks MVVM now as have view code in viewmodel. Need to take out somehow
Guide.BeginShowMessageBox("Test", "Test network", new List<string>() { "Yes", "No" }, 0, MessageBoxIcon.Warning, asyncResult =>
{
int? returned = Guide.EndShowMessageBox(asyncResult);
// if yes then work offline mode? Maybe another property in ViewModel will get set to say offline mode?
}, null);
}
return null;
}
set
{
// Not sure what to put here.
}
}

// View

<i:Interaction.Triggers>
<i:EventTrigger>
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding MainPageLoaded}"/>
</i:EventTrigger>
</i:Interaction.Triggers>

编辑我遇到的另一个问题是。我有一个列表,该列表绑定(bind)到存储在此属性中的一些数据

   public ObservableCollection<ContactGroup> ContactGroups { get; set; }

然后点击我有一个应该被触发的中继命令

 public ICommand GroupContactTapped
{
get
{
return new RelayCommand<GestureEventArgs>(e =>
{
var selectedTextBlock = e.OriginalSource as TextBlock;

MessageBox.Show(selectedTextBlock.Tag.ToString());
});
}
}

但我不知道如何在不将源代码转换为文本 block 的情况下找到“点击”了哪个对象。

最佳答案

假设您有一个主页/ View 承载所有其他 View ,例如主窗口:我从 View 模型发送消息事件,对话框在主窗口的代码后面处理。这是我项目中唯一的代码隐藏,所以我发现项目的其余部分可以严格使用 MVVM 是可以接受的,除了这个异常(exception)。

我发送的消息包含以下内容(从 VB 转换而来,因此它可能需要工作):

object message = new DialogMessage("YourMessage", YourFunctionThatHandlesCallback) {
Button = MessageBoxButton.YesNo,
Caption = "Caption Goes Here"
};
Messenger.Default.Send(message);

我在后面的主页面代码中注册了以下对话框:

Partial Public Class MainWindow
Inherits Window

Public Sub New()
InitializeComponent()

''single initialization of messanger for catching message box
Messenger.[Default].Register(Of DialogMessage)(Me, Sub(msg)
Dim result = MessageBox.Show(msg.Content, msg.Caption, msg.Button, MessageBoxImage.Warning)
''Send callback
msg.ProcessCallback(result)
End Sub)
End Sub
End Class

我无法成功转换 C# lambda,所以我不得不将它留在 VB 中。希望这有帮助

关于c# - 使用 MVVM 模式时如何处理 MessageBox 对话框(MVVM Light ToolKit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15420793/

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