我有一个独立的用户控件类库(WPF),它实际上定义了一个事件。 此事件必须由已加载用户控件的 WPF 主机应用程序(exe)处理。
但是,当我为用户控件调试时遵循下面的代码,事件“WebDataReceived”仍然存在,因此不会触发 WPF 主机中的处理程序/订阅者(即“ReceiveJsonData”)。
UserControl视图模型类:
public class WebViewModel: ViewBase
{
public event EventHandler<string> WebDataReceived;
private void CoreWebView2_WebMessageReceived(object? sender,
CoreWebView2WebMessageReceivedEventArgs e)
{
// Deserialize JSON data
var data = JsonSerializer.Deserialize<string>(e.WebMessageAsJson);
// Raise event with incoming data
//WebDataReceived?.Invoke(this, data);
WebDataReceived?.Invoke(this, data);
}
}
每当触发语句“WebDataReceived?.Invoke()”时,“WebDataReceived”保持为空。
订阅事件的WPF-Host代码隐藏类及其事件处理程序所在的视图模型:
请注意,“WebViewUC”是我的用户控件对象,“WebHostViewModel”是 WPF-Host 的视图模型。
public partial class MainWindow : Window
{
InitializeComponent();
webViewUC = new WebViewUC();
webHostViewModel = new WebHostViewModel(webViewUC);
this.DataContext= webHostViewModel;
webViewUC.WebViewModel.WebDataReceived += WebViewModel_WebDataReceived;
}
private void WebViewModel_WebDataReceived(object? sender, string e)
{
webHostViewModel.ReceiveJsonData(sender,e);
}
}
internal class WebHostViewModel : INotifyPropertyChanged
{
public void ReceiveJsonData(object? sender,string
jsonDataString)
{
if (jsonDataString is not null && sender is not null)
{
// Deserialize the JSON string to a JsonData object
JsonData receivedJsonData = JsonConvert.DeserializeObject<JsonData>(jsonDataString);
// Update the JsonData property
JsonData = receivedJsonData;
}
}
编辑
请注意,当前代码描述了用户控件与其 WPF 宿主之间的紧耦合,稍后我将进行此更改并介绍使用 Unity 容器以确保两者之间的松耦合。