【问题标题】:Pass parameter to UserControl viewmodel将参数传递给 UserControl viewmodel
【发布时间】:2021-06-08 13:19:22
【问题描述】:

我正在为测试台编写监控程序。我正在使用 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(实际上不可能)...

【问题讨论】:

  • 为什么要从视图模型传递到视图,然后再传递到其他视图,然后再传递到其他视图模型?父视图模型知道它的子视图模型并且可以直接通信。
  • @Haukinger 嘿,谢谢您的回复!我想了想,但真的不明白你的意思。我更新了我的问题以使其更容易理解。干杯!
  • 我的意思是视图模型(不是视图)创建视图模型,因此,视图模型可以将构造函数参数传递给视图模型的构造函数和/或它们保留引用并读取或写入视图的属性他们创建的模型(或以更复杂的方式交互)。

标签: c# wpf mvvm prism


【解决方案1】:

您可以使用 IEventAggregator 中的 PubSubEvent 将信息从您的数据类传递到您的 ViewModel。

【讨论】:

    【解决方案2】:

    在我看来,您的问题是关于如何在 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 可能有更优雅的解决方案,但我没有研究它。

    然后将参数提供给用户控件的视图模型。

    【讨论】:

    • 感谢您的详细回答,但我并不想为用户创建拖放操作。我试图让我和未来的开发人员更容易扩展程序。因此,我创建了以不同方式显示传感器值的自定义 ui 元素。但是以整个 mvvm 的心态,我很难告诉 ui 元素 VM 它正在显示什么传感器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多