我正在为测试台编写监控程序。我正在使用 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 });
}
}
}
用户界面相当复杂。它显示所有传感器值,其中许多值有不同的表示。为了让开发人员更容易扩展程序,我创建了 UserControls,例如一组显示传感器名称、值和单位的标签。我想重用这些,所以我不必为每个传感器创建它们。以下是 I#M 目前的做法:UserControl VIEW 绑定到变量,如 VIEWMODEL 的名称、值和单位。 VIEWMODEL 订阅数据类的 MeasurementChanged 事件。要知道显示 VIEWMODEL 的传感器,需要知道在 Visual Studio ui 编辑器中放置 UserControl 时要显示的传感器。
当我将 UserControl 放置在 Visual Studio ui 编辑器中时,如何告诉 VIEWMODEL 它应该在 xaml 中显示什么传感器?
谢谢!
编辑 1 11.03:
我已经研究了很多,但找不到解决我问题的解决方案。我需要的是一个依赖属性(不起作用,因为 VIEWMODEL 派生自 BindableBase)或将构造函数参数传递给 xaml 中的 VIEMODEL(不太可能)...
答案 0 :(得分:0)
在我看来,您的问题是关于如何在 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 可能有更优雅的解决方案,但我没有研究它。
之后,您将参数提供给用户控件的视图模型。