我目前正在为我正在处理的应用构建用户界面,但我遇到了一些绑定问题。
情景:
我有一个枢轴控制,每个枢轴元素都包含一个额外的框架/页面。 现在我在第一个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();
}
}
答案 0 :(得分:1)
通常,XAML父级的子级继承所述父级的绑定上下文。 因此,不确定是否需要将VM连接到您的框架。
但是假设它不适用于Frames,你正在为主页创建一个新的MainViewModel!
这里的解决方案是创建一个单独的MainViewModel并抓住那个来连接BindingContext
。
答案 1 :(得分:1)
听起来你错过了一个&#34;服务层&#34;或&#34;业务层&#34;你的申请。您需要一个管理数据的外部类,并且可以提供填充ViewModel的模型:
我建议使用某种依赖注入,因此每个页面视图模型都引用了DataProvider
服务类。此类使串行端口工作以获取模型列表,并提供用于获取数据和将任何更新推送到ViewModel的接口。
处理共享的事件的好方法,比如说&#34;加载数据&#34;可能出现在不同视图模型上的按钮是Event Aggregator。可以注入到可以在应用程序中引发或订阅事件的类的服务。
答案 2 :(得分:1)
您可以使用Publisher-Subscriber模式(Pub-Sub)。
此处已解释过:Communication Between Views in MVVM (Pub-Sub Pattern)