在MVVM中挣扎

时间:2017-12-09 16:05:07

标签: xaml mvvm uwp

我有一个名为osmAppBarButton的类,它继承自AppBarButton(UWP),我已经添加了一个名为ButtonState的依赖项属性。 (Enum Normal,Dim,Bright,Flash)

我在所有osmAppBarButtons上都使用了一个Style,它使用DataTriggerBehavior来检查ButtonState并选择适当的VisualState。

我非常喜欢自己,因为DP和VisualStateManager对我来说都是新手。然后我遇到了问题..

如何在不破坏MVVM的情况下从ViewModel更改osmAppBarButton的ButtonState?我想在我的视图中为每个按钮的ButtonState设置一个VM属性,但这意味着VM会对View有一些了解。

我认为答案可能在于附加行为,但我没有找到适合的例子。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

从viewmodel属性获取值到依赖项属性的方法是使用Binding。当然不是附加行为;我确定你可以通过附加行为找到某种方法,但只需使用Binding

`viewmodel必须实现INotifyPropertyChanged,它必须是appbar按钮所在视图的DataContext,并且你不能通过将DataContext绑定到appbar按钮的某个父级中的随机内容来拍摄自己。

为viewmodel提供一个公共属性,在其值更改时引发PropertyChanged。绑定到该财产。

类似ButtonState的枚举,其中包含普通,暗淡,明亮,闪光的值,并不是视图模型应该在"适当的"中识别的东西。 MVVM实现。这实际上也不是一个愚蠢的观点。我建议让viewmodel通过以自己的方式表达viewmodel状态的属性公开其状态(如果我知道你在这里做了什么,我可以给你一个例子)。也许viewmodel有一个可以是Normal,Busy,Error,Waiting的状态 - 那些可能映射到各种ButtonState值。 "错误"是视图模型的状态。 "闪光灯" 是视图可能选择将给定视图模型状态传达给用户的众多方式之一。

如果视图模型使用一个或多个类型不是ButtonState的属性来表达相关状态,那么您可以编写一个转换器 - 可能是一个多转换器 - 将所有这些转换为{{1}价值。

但如果您的学习计划在视图模型中使用ButtonState,那么它将不会成为世界的终点,并且它会更简单。所以把它绑定到这个:

ButtonState

XAML:

private ButtonState _fooBarButtonState = ButtonState.ItsComplicated;
public ButtonState FooBarButtonState {
    get { return _fooBarButtonState; }
    set {
        if (value != _fooBarButtonState) {
            _fooBarButtonState = value;
            OnPropertyChanged(nameof(FooBarButtonState));
        }
    }
}

但是如果你想在视图模型中使用我的建议来使用不同的状态枚举,那么转换器就非常容易编写。如果你遇到麻烦,请告诉我,但如果你有一个依赖属性并且查看状态有效,那么你就可以得到它。