我正在开发一个应用程序,并且正在使用 MVVM 方法。
基本上目前有两个Page
s 和 1 MainWindow
.
我使用 Frame
在页面之间切换里面 MainWindow
.
在主窗口中,有2个按钮,基本上是全局的,应该在所有页面中显示; x(退出)和设置。
这基本上是我的“外壳”,因为我决定不使用窗口边框。
问题是我希望每个页面都有不同的背景,这就是它变得复杂的地方:
- 设置页面:灰色背景。
- 主页:根据属性更改的旋转背景颜色。
事情是在主窗口中设置背景,因为它也应该应用于全局区域(顶部,退出和设置按钮所在的位置)。
我首先将背景(在 MainWindow
中)设置为绑定(bind)到代表当前页面的属性(然后在转换器的帮助下将值转换为颜色十六进制代码)。
总而言之,这会导致当页面更改时背景会更改,但 MainPage
中的属性不会更改。变化。我可以清楚地理解为什么,但我不知道如何解决它。
到目前为止我想出的可能的解决方案:
MainWindow
中的绑定(bind)在 MainPage
中更改属性时更新/刷新. 如果是这样,解决这个问题的最佳方法是什么?
最佳答案
如果您还没有,我建议您通过 NuGet 安装一些软件包,以使 MVVM 风格的开发更加愉快。我个人更喜欢MVVMLight这是...嗯,很轻,但它也包含很多有用的功能。
要在 ViewModel 之间进行通信,您有(至少)两种可能的方法。
1)ViewModelLocator(不推荐)
ViewModelLocator是保存对所有 View 模型的引用的中心位置。您可以添加一个属性,然后所有 View 模型都使用该属性来获取/设置背景。
....
x:Name="Main"
DataContext="{Binding Source={StaticResource Locator}, Path=MainVM}">
....
<Grid Background="{Binding Background, Converter={StaticResource StringBrushConverter}}">
...
2)信使(推荐)
当您的 View 模型或方法中的任何属性更改被执行时,您可以发送一条消息,说明您的 MainViewModel 已注册以监听。发送消息就像...
Messenger.Default.Send(new UpdateBackgroundMessage(new SolidColorBrush(Colors.Blue)));
您将在 MainViewModel 的构造函数中注册此消息:
Messenger.Default.Register<UpdateBackgroundMessage>(this, message =>
{
Background = message.Brush;
});
实际的消息类是:
public class UpdateBackgroundMessage : MessageBase
{
public UpdateBackgroundMessage(Brush brush)
{
Brush = brush;
}
public Brush Brush { get; set; }
}
我知道我在这里简化了事情,但我希望你明白了。即使您决定不使用 MVVMLight,这两种方法都有效。
编辑:
这是带有示例的 Git 存储库 https://github.com/mikkoviitala/cross-viewmodel-communication
关于c# - WPF 导航和旋转背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24221068/