传递参数给UserControl视图模型



我正在为一个试验台编写监控程序。我正在使用Prism并尝试保持良好的MVVM实践。然而,我发现真的很难找到一个解决我的问题的方法:

我有一个定期从不同传感器接收测量值的服务。它将每个传感器具有唯一id的值传递给数据类。

数据类是我的程序的主干。它维护每个传感器的最后测量列表,更新它们的值并通知值的变化。它是一个静态类,所以每个类都可以访问它。

//Rudimentary version of my data class, static and backbone of app.
public static class Data
{
// Event signaling the change of a measurement, includes modified id in event
#region event
public static event EventHandler<MeasurementChangedEventArgs> MeasurementChanged;
static void OnMeasurementChanged(MeasurementChangedEventArgs e) { MeasurementChanged?.Invoke(typeof(Data), e); }
#endregion
// List with custom measurement object containing multiple properties (e.g. Name, Value, Unit)
private static List<Measurement> measurements = new List<Measurement>();
// Used by server to set values
public static void SetMeasurementValue(int id, float value)
{
// Get entry(s)
IEnumerable<Measurement> data = measurements.Where(p => p.ID == id);
if (0 < data.Count())
{
// Set value
foreach (var item in data) { item.Value = value; }
// Signal change
OnMeasurementChanged(new MeasurementChangedEventArgs { id = id });
}
}
}

ui相当复杂。它显示所有的传感器值,许多以不同的表示。为了使开发人员更容易扩展程序,我创建了UserControls,例如一组标签,显示传感器的名称,值和单位。我想重用这些,所以我不必为每个传感器创建它们。下面是我目前的做法:UserControl VIEW绑定到VIEWMODEL的名称、值和单位等变量。VIEWMODEL订阅数据类的MeasurementChanged事件。要知道VIEWMODEL要显示什么传感器,需要知道当我在visual studio ui编辑器中放置UserControl时我想显示什么传感器。

我如何告诉VIEWMODEL它应该显示什么传感器,在xaml,当我把UserControl在visual studio ui编辑器?

谢谢!

编辑1 11.03:

我已经研究了很多,但找不到解决我问题的方法。我需要的是像一个依赖属性(不工作,因为VIEWMODEL派生自BindableBase)或传递一个构造函数参数到VIEMODEL在xaml(不太可能)…

您可以使用来自IEventAggregator的PubSubEvent来将数据类中的信息传递给ViewModel。

在我看来,你的问题是如何在MVVM中实现拖放。我建议你在你的项目中添加一个对GongSolutions.WPF.DragDrop的引用。

那么在xaml中你可以引用这个包:

xmlns:dragDrop="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop"

将此属性添加到Dragsource(您拖动的元素):

dragDrop:DragDrop.IsDragSource="True"

和这些到DropTarget(您放置到的元素)

dragDrop:DragDrop.IsDropTarget="True"
dragDrop:DragDrop.DropHandler="{Binding}"

你的ViewModel应该实现IDropTarget接口:

public class M_ViewModel : BaseViewModel, IDropTarget

并定义以下函数:

public void DragOver(IDropInfo dropInfo)
{
}
public void Drop(IDropInfo dropInfo)
{
}
现在您应该能够在视图模型中触发DropEvent了。关于用户选择了哪个传感器的信息,您可以在开始拖动时使用来自所选元素的信息(也许您有一个元素列表,您可以绑定到所选的元素并使用该信息)。我这样做了,可能有一个更优雅的解决方案使用DropInfo,但我没有研究它。

然后你给你的usercontrol的视图模型参数。

最新更新