如何在另一个Page / Viewmodel上使用在一个ViewModel中创建的数据?

时间:2018-02-20 13:27:49

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

我目前正在为我正在处理的应用构建用户界面,但我遇到了一些绑定问题。

情景:

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

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

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

当完成后,我有一个页面,我用串行端口收集数据。 我将数据保存到List,我希望能够使用来自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();
        }
    }

3 个答案:

答案 0 :(得分:1)

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

但是假设它不适用于Frames,你正在为主页创建一个新的MainViewModel!

这里的解决方案是创建一个单独的MainViewModel并抓住那个来连接BindingContext

答案 1 :(得分:1)

听起来你错过了一个&#34;服务层&#34;或&#34;业务层&#34;你的申请。您需要一个管理数据的外部类,并且可以提供填充ViewModel的模型:

enter image description here

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

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

答案 2 :(得分:1)

您可以使用Publisher-Subscriber模式(Pub-Sub)。

此处已解释过:Communication Between Views in MVVM (Pub-Sub Pattern)