MVVM:绑定外部对象属性

时间:2017-10-26 06:59:00

标签: c# wpf mvvm

我有一个相当简单的案例,但我无法得到正确的解决方案。 在我的MVVM应用程序上,我希望我的MainView(附加到MainViewModel)通过绑定显示当前用户登录(名称)。

User类是实施INPC的POCO。 CurrentUser实例是我的应用程序控制器AppController静态属性。 LogOn property是我想在MainView中显示的字符串。

如此简短的版本:我想在AppController.CurrentUser.LogOn中绑定MainView

我尝试了几种静态绑定方式(比如在this article中),我无法让它工作。

有任何想法让这项工作?

感谢。

修改

问题是初始绑定有效,但是当我将另一个User对象设置为当前用户时,即使AppControl.CurrentUser属性引发静态事件PropertyChanged,也不会刷新LogOn属性。

编辑2

我尝试了@Henk Holterman解决方案(来自ViewModel的echo属性),并调试它我找到了诀窍:事实上,问题是竞争条件:我的ViewModel通过EventAggregator提升UserChanged事件,然后引发PropertyChanged,但它太快了,当事件提升时,AppController上的对象引用没有改变。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您的AppController类可能如下所示:

public class User
{
    public string LogOn { get; set; }
}

public static class AppController
{
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    private static User currentUser;
    public static User CurrentUser
    {
        get { return currentUser; }
        set
        {
            currentUser = value;
            StaticPropertyChanged?.Invoke(null,
                new PropertyChangedEventArgs(nameof(CurrentUser)));
        }
    }
}

然后Binding可能会这样写:

<TextBlock Text="{Binding Path=(local:AppController.CurrentUser).LogOn}"/>