【问题标题】:How to use data created in one ViewModel on another Page/Viewmodel?如何在另一个页面/视图模型上使用在一个视图模型中创建的数据?
【发布时间】:2018-07-30 21:10:27
【问题描述】:

我目前正在为我正在开发的应用程序构建 UI,但我遇到了一些绑定问题。

情景:

我有一个枢轴控件,每个枢轴元素都由一个额外的框架/页面组成。 现在我在第一个 PivotItem 上有一个 TextBlock。我将它绑定到一个“字符串”并使用一个按钮在按钮的两个可能内容之间切换。

当按钮在同一个页面/框架上时,它就像一个魅力。但是,当我在 MainPage 上实现一个按钮并为 MainPage 实现相同的 Viewmodel 时,它就不起作用了。它只会更改 MainPage 上的字符串内容。

是否可以为每个页面/框架实施更改?

完成后,我有一个页面,我可以在其中使用串行端口收集数据。 我将数据保存到一个列表中,我希望能够从 2 个不同的页面/框架中使用这个列表。 考虑上面的场景,它可能会为我有按钮获取数据的页面收集数据,但它可能不会在其他页面上显示任何内容。 我怎样才能按照我想要的方式构建它?

这是一个简短的例子:

Mainpage.xaml

<StackPanel>
    <Button Height="50" Width="200" Content="Change" FontSize="30" FontWeight="Bold" Margin="50 50 0 0" Click="{x:Bind MainViewModel.Change}"/>

    <Pivot x:Name="MainPivot" Margin="50 50">
        <PivotItem Header="Page 1">
            <Frame x:Name="Page1" />
        </PivotItem>
    </Pivot>
</StackPanel>

Mainpage.xaml.cs

public MainPage()
{
    this.InitializeComponent();
    Page1.Navigate(typeof(Page1));

    ViewModel = new MainViewModel();
}
public MainViewModel ViewModel { get; private set; }

Page1.xaml

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <TextBlock Text="{x:Bind Path=ViewModel.StringModel.String1, Mode=TwoWay}" FontSize="50" FontWeight="Bold" />

    <Button Content="Change" FontSize="30" FontWeight="Bold" Click="{x:Bind ViewModel.Change}"/>
</StackPanel> 

Page1.xaml.cs

public Page1()
{
    this.InitializeComponent();
    ViewModel = new MainViewModel();
}

public MainViewModel ViewModel { get; private set; }

MainViewModel.cs

private StringModel _stringModel = new StringModel();

public StringModel StringModel
{
    get => _stringModel;
    set
    {
        if (_stringModel != value)
        {
            _stringModel = value;
            OnPropertyChanged();
        }
    }
}

public void Change()
{
    if (StringModel.String1 == "Text1")
    {
        StringModel.String1 = "Text2";
    }
    else
    {
        StringModel.String1 = "Text1";
    }   
}

StringModel.cs

private string _string1 = "XXX";

    public string String1
    {
        get => _string1;
        set
        {
            _string1 = value;
            OnPropertyChanged();
        }
    }

【问题讨论】:

    标签: c# xaml data-binding uwp win-universal-app


    【解决方案1】:

    听起来您缺少应用程序的“服务层”或“业务层”。您需要一个管理数据的外部类,并且可以提供模型来填充您的 ViewModel:

    我建议使用某种依赖注入,因此您的每个页面视图模型都引用了DataProvider 服务类。此类通过串行端口工作来获取模型列表,并提供用于获取数据并将任何更新推送到 ViewModel 的接口。

    处理共享的事件 的一种好方法是Event Aggregator,例如可能出现在不同视图模型上的“加载数据”按钮。可以注入到可以在应用程序中引发或订阅事件的类中的服务。

    【讨论】:

      【解决方案2】:

      XAML 父级的子级通常会继承所述父级的绑定上下文。 所以不确定是否需要将 VM 连接到框架。

      但假设它不适用于框架,您正在为框架创建一个新的 MainViewModel,就像为主页一样!

      这里的解决方案是创建一个单例 MainViewModel 并获取那个以连接BindingContext

      【讨论】:

      • 好的,我设法实现了单例,这解决了我的第一个问题。我仍然必须在串口项目中实现它,但我很有信心它可以工作。到目前为止谢谢:)
      【解决方案3】:

      您可以使用发布者-订阅者模式(Pub-Sub)。

      这里已经解释过了:Communication Between Views in MVVM (Pub-Sub Pattern)

      【讨论】:

        猜你喜欢
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2018-05-23
        • 1970-01-01
        相关资源
        最近更新 更多