在两个用户控件/视图之间传递数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在两个用户控件/视图之间传递数据相关的知识,希望对你有一定的参考价值。
使用MVVM
我正在尝试在一个视图(view1)中传递在控件(附加代码中的文本框)中输入的数据,并在第二个视图(view2)中使用该数据。目前,通过在App.xaml文件中声明我的所有视图,我可以将view2中的文本块与在view1中的文本框中输入的信息绑定起来,并查看显示在所述文本块中的信息。但是我也想使用在view2的视图模型中输入的信息,但不知道如何在其中访问它以使用信息。
有人可以告诉我如何去做吗?谢谢!
App.xaml [资源声明]
<Application.Resources>
<vws:DefaultVM x:Key="DefaultVMApp"></vws:DefaultVM>
<vws:View1 x:Key="View1App"></vws:View1>
<vws:View2 x:Key="View2App"></vws:View2>
<vm:AppVM x:Key="AppVMApp"></vm:AppVM>
<vm:View1VM x:Key="View1VMApp"></vm:View1VM>
<vm:View2VM x:Key="View2VMApp"></vm:View2VM>
</Application.Resources>
View1.xaml
<UserControl.DataContext>
<StaticResource ResourceKey="View1VMApp"></StaticResource>
</UserControl.DataContext>
<Grid Background="Aqua">
<StackPanel Margin="100">
<TextBox x:Name="firstNameTextBoxView1" Text="Binding View1InfoClass.FirstName, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged"></TextBox>
<Button Command="Binding Source=StaticResource AppVMApp, Path=View2ButtonCommand" Content="Go to view2" Height="20" Width="70" />
</StackPanel>
</Grid>
View2.xaml
<UserControl.DataContext>
<StaticResource ResourceKey="View2VMApp"></StaticResource>
</UserControl.DataContext>
<Grid Background="Beige">
<StackPanel Margin="100">
<TextBlock x:Name="View1TextBlock" Text="Binding Source=StaticResource View1VMApp, Path=View1InfoClass.FirstName" ></TextBlock>
</StackPanel>
</Grid>
AppVM
public class AppVM : ObservableObject
//Create a property that controls current view
private static object _currentView = new DefaultVM();
public object CurrentView
get return _currentView;
private set
OnPropertyChanged(ref _currentView, value);
private string _textboxText;
public string TextboxText
get return _textboxText;
set
OnPropertyChanged(ref _textboxText, value);
public AppVM()
View1ButtonCommand = new RelayCommand(ShowView1, AlwaysTrueCommand);
View2ButtonCommand = new RelayCommand(ShowView2, AlwaysTrueCommand);
DefaultCommand = new RelayCommand(ShowDefault, AlwaysTrueCommand);
//Instantiate the relaycommands, we will need to instantiate relaycommand objects for every command we need to perform.
//This means that we will need to do this for preses of all buttons
public RelayCommand View1ButtonCommand get; private set;
public RelayCommand View2ButtonCommand get; private set;
public RelayCommand DefaultCommand get; private set;
public void ShowDefault(object dummy)
CurrentView = new DefaultVM();
public void ShowView1(object dummy)
CurrentView = new View1();
public void ShowView2(object dummy)
CurrentView = new View2();
public bool AlwaysTrueCommand(object dummy)
return true;
代码中的基本问题是,您已经为每个用户控件专用了一个预定义的视图模型对象。这是really不好的。必须保留用户控件的数据上下文,以便客户端代码(例如您的主窗口)确定并用于绑定用户控件公开的特定属性。[很遗憾,您的问题中没有足够的上下文来提供清晰,完整的答案。但是要解决您的问题,您需要采取其他措施:
- 首先,首先是将用于用户控件的视图模型与用户控件本身“分离”。为此,可以向每个用户控件添加依赖项属性,然后让使用用户控件的主视图决定要绑定到这些依赖项属性中的每一个的内容。是否
- not允许用户控制自己设置自己的数据上下文。完成此操作后,您可能会发现两个用户控件只能使用与主视图相同的视图模型。即您将主视图的数据上下文设置为单个视图模型,用户控件将继承该数据上下文,例如,将
TextboxText
属性绑定到每个用户控件中适当的声明的依赖项属性。这样,单个属性将同时表示两个用户控件的状态。 - 人们希望这足以使您重回正轨。如果不是,请考虑在“堆栈溢出”中搜索与视图模型及其与用户控件的关系有关的其他问题。例如,这些问题:Issue with DependencyProperty bindingXAML binding not working on dependency property?WPF DataBinding with MVVM and User Controls
[其他问题不能完全解决您的情况,但是应该为您提供一些其他方法来构建视图模型:MVVM : Share data between ViewModelsSharing non control related data between WPF ViewModel and UserControlSharing data between different ViewModelsSharing state between ViewModels
以上是关于在两个用户控件/视图之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章