0

这个想法是这样做的。我有一个登录页面,已成功将 Username.text 值传递到主窗口中的文本框中。

现在我需要将主窗口中的这个 username.text 值传递给所有子页面中的文本框。我这样做是为了让程序知道哪个用户正在登录,并可以记录谁对数据库进行了哪些更改。

据我所知,单向数据绑定是最好的方法,但是,我知道我需要创建一个视图模型单例实例,以便它在主窗口和子页面之间工作。

这是我没有做的。此代码在同一页面中运行良好。

    <TextBox x:Name="username" Text="{Binding Text, ElementName=alias, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" Height="19" VerticalAlignment="Top" HorizontalAlignment="Left" Width="211" FontSize="11"/>

<TextBox x:Name="alias" Margin="186,64,0,0" Height="18" VerticalAlignment="Top" HorizontalAlignment="Left" Width="211" FontSize="11" ></TextBox>

但是在不同的页面中,什么都没有。

主窗口代码

<mui:ModernWindow x:Class="Masca.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mui="http://firstfloorsoftware.com/ModernUI"
Title="Masca Database Admin" Height="800" Width="1280" IsTitleVisible="True"
LogoData="F1 M 24.9015,43.0378L 25.0963,43.4298C 26.1685,49.5853 31.5377,54.2651 38,54.2651C 44.4623,54.2651 49.8315,49.5854 50.9037,43.4299L 51.0985,43.0379C 51.0985,40.7643 52.6921,39.2955 54.9656,39.2955C 56.9428,39.2955 58.1863,41.1792 58.5833,43.0379C 57.6384,52.7654 47.9756,61.75 38,61.75C 28.0244,61.75 18.3616,52.7654 17.4167,43.0378C 17.8137,41.1792 19.0572,39.2954 21.0344,39.2954C 23.3079,39.2954 24.9015,40.7643 24.9015,43.0378 Z M 26.7727,20.5833C 29.8731,20.5833 32.3864,23.0966 32.3864,26.197C 32.3864,29.2973 29.8731,31.8106 26.7727,31.8106C 23.6724,31.8106 21.1591,29.2973 21.1591,26.197C 21.1591,23.0966 23.6724,20.5833 26.7727,20.5833 Z M 49.2273,20.5833C 52.3276,20.5833 54.8409,23.0966 54.8409,26.197C 54.8409,29.2973 52.3276,31.8106 49.2273,31.8106C 46.127,31.8106 43.6136,29.2973 43.6136,26.197C 43.6136,23.0966 46.127,20.5833 49.2273,20.5833 Z"          
ContentSource="/Pages/Home.xaml">

    <Window.DataContext>
<TextBox x:Name="username" Text="{Binding Text, ElementName=alias, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" Height="19" VerticalAlignment="Top" HorizontalAlignment="Left" Width="211" FontSize="11"/>

子页面代码

    <UserControl x:Class="Masca.Mail.Configuration"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mui="http://firstfloorsoftware.com/ModernUI"
     mc:Ignorable="d" 
     d:DesignHeight="800" d:DesignWidth="1280">

<TextBox x:Name="alias" Margin="186,64,0,0" Height="18" VerticalAlignment="Top" HorizontalAlignment="Left" Width="211" FontSize="11" ></TextBox>

有人知道怎么做吗?

4

2 回答 2

0

如果您使用 MVVM 并且目标是在视图模型之间共享数据,那么您需要的是Mediator/ EventAggregator。登录成功后,您的 MainViewModel 可以将数据发布到 Mediator,并且所有其他 ViewModel 都可以侦听此消息并更新其相应的 UserName 属性。

更多关于这些的阅读:

事件聚合器:http : //blogs.u2u.be/diederik/post/2011/01/15/Using-the-Prism-40-Event-Aggregator.aspx

调解员:http: //marlongrech.wordpress.com/2009/04/16/mediator-v2-for-mvvm-wpf-and-silverlight-applications/

然而,如果你真的想让你的 ViewModel 成为一个单例并且DataContext对所有的视图都有这个,你想阅读这个关于在 C# 中实现单例的MSDN页面。

于 2013-10-27T12:27:57.483 回答
0

我建议您使用 Cinch MVVM 框架,该框架使用 MEF 来实例化/注入 ViewModel。使用正确的导出属性制作单例视图模型非常容易。

检查项目的站点。我鼓励你使用它。

http://cinch.codeplex.com/

于 2013-10-27T12:11:18.777 回答