在两个用户控件/视图之间传递数据

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;
            
        

View1 and View2 layout, kind of TLDR

答案

代码中的基本问题是,您已经为每个用户控件专用了一个预定义的视图模型对象。这是really不好的。必须保留用户控件的数据上下文,以便客户端代码(例如您的主窗口)确定并用于绑定用户控件公开的特定属性。[很遗憾,您的问题中没有足够的上下文来提供清晰,完整的答案。但是要解决您的问题,您需要采取其他措施:

    首先,首先是将用于用户控件的视图模型与用户控件本身“分离”。为此,可以向每个用户控件添加依赖项属性,然后让使用用户控件的主视图决定要绑定到这些依赖项属性中的每一个的内容。是否
  1. not允许用户控制自己设置自己的数据上下文。完成此操作后,您可能会发现两个用户控件只能使用与主视图相同的视图模型。即您将主视图的数据上下文设置为单个视图模型,用户控件将继承该数据上下文,例如,将TextboxText属性绑定到每个用户控件中适当的声明的依赖项属性。这样,单个属性将同时表示两个用户控件的状态。
  2. 人们希望这足以使您重回正轨。如果不是,请考虑在“堆栈溢出”中搜索与视图模型及其与用户控件的关系有关的其他问题。例如,这些问题:Issue with DependencyProperty bindingXAML binding not working on dependency property?WPF DataBinding with MVVM and User Controls
  3. [其他问题不能完全解决您的情况,但是应该为您提供一些其他方法来构建视图模型:MVVM : Share data between ViewModelsSharing non control related data between WPF ViewModel and UserControlSharing data between different ViewModelsSharing state between ViewModels

以上是关于在两个用户控件/视图之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

在同一页面中的另一个用户控件引发的事件上填充用户控件

WPF 将对象从窗口的用户控件传递到另一个窗口的用户控件

jQuery + MVC 用户控件

自定义服务器控件和用户控件之间是不是存在性能差异?

使用Prism Event Aggregator在View模型之间传递数据

MVVM Light - 用户控件作为视图