【发布时间】:2013-11-28 05:09:57
【问题描述】:
我希望将数据从 WinForm 传递到 WPF 窗口并从 WPF 窗口接收回消息。
我的代码是随机在线教程和 HighCore 的 log viewer 的混合体。我有一个 WinForm 以下列方式启动我的新 WPF 窗口:
private void openTransactionViewToolStripMenuItem_Click(object sender, EventArgs e)
{
var transactionViewWindow = new TransactionViewer.MainWindow();
ElementHost.EnableModelessKeyboardInterop(transactionViewWindow);
transactionViewWindow.Show();
transactionViewWindow.Test = "test"; // testing out data passing
transactionViewWindow.AddTest();
}
我的 MainWindow.xaml.cs 看起来像:
public partial class MainWindow : Window
{
public ObservableCollection<Session> SessionList { get; set; }
public string Test{ get; set; }
public MainWindow()
{
InitializeComponent();
SessionList = new ObservableCollection<Session>();
SessionList.Add(new Session() { BeginLine = 0, EndLine = 1, Message = "some message" });
SessionList.Add(new Session() { BeginLine = 2, EndLine = 3, Message = "another message" });
SessionItems.ItemsSource = SessionList; // the ItemsControl
}
public void AddTest()
{
SessionList.Add(new Session() { BeginLine = 4, EndLine = 5, Message = Test });
}
}
public class Session : PropertyChangedBase
{
public int BeginLine { get; set; }
public int EndLine { get; set; }
public string Message { get; set; }
}
其中PropertyChangedBase 继承自INotifyPropertyChanged。我有一个绑定到Message 的 ItemsControl。我的输出看起来像:
一些消息
另一条消息
测试
“数据传递”成功!最终,当 WPF 窗口加载时,我想从我的 WinForm 传递一个List<Session>,它将用于填充 ItemsControl。我还希望在 WinForm 上有一个按钮,它将发送一个列表来重新填充/刷新 WPF 中的数据。从当前的行为来看,我认为即使使用我当前的简单实现(只需更新SessionList),这也是可能的。
有没有更合适的方法来做到这一点?例如事件?我是否需要触发一个事件以告诉我的 WinForm WPF 已成功添加所有 Session 对象,或者每当用户单击特定对象时?
在这里使用 MVVM 有什么好处?
我已经为 WinForms 开发了一段时间,发现向 WPF 的过渡非常混乱。希望有人可以提供一些指导或代码示例。
编辑:供将来参考,可以在此处找到针对像我这样的人的体面的 MVVM 教程:http://jpreecedev.com/2013/06/08/wpf-mvvm-for-winforms-devs-part-1-of-5/
【问题讨论】:
-
那么你在同一个进程中有 WPF 和 WinForms 吗?同一个程序集?
-
@JeffBridgman 是的,他们也在同一个解决方案中。我在现有解决方案中添加了一个 WPF 自定义控件库项目。