【发布时间】:2016-05-05 14:09:00
【问题描述】:
我在 Model 类中有一个静态 bool 属性,我将它公开给两个不同的 ViewModel 类。其中一个 ViewModel 有一个 bool 属性链接到所述静态属性,并通过转换器绑定到按钮的 Visibility。然后可以在该 ViewModel 中将其设置为 true 或 false,并且按钮的可见性会相应更改。 (此 ViewModel 的实例通过按钮所在的 DataContext 在 View 的 XAML 中设置) 我希望能够从不同的视图中更改此按钮的可见性,并且我认为通过在我的单独视图的 ViewModel 中拥有一个也链接到我的原始模型中的静态布尔值的属性,我可以做到这一点,但它不是什么都不做。
这是我的代码:
主模型
public class MainModel
{
static bool _ButtonIsVisible = true;
public static bool ButtonIsVisible
{
get { return _ButtonIsVisible; }
set { _ButtonIsVisible = value; }
}
}
MainViewModel
class MainViewModel: ObserveableObject
{
public bool ButtonIsVisible
{
get { return MainModel.ButtonIsVisible; }
set
{
MainModel.ButtonIsVisible = value;
RaisePropertyChanged("ButtonIsVisible");
}
}
}
主视图
<Window x:Class="MVVM.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:MVVM"
mc:Ignorable="d"
Title="MainWindow" Width="1920" Height="1080" WindowState="Maximized" WindowStyle="None">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
</Window.Resources>
<Button Visibility="{Binding ButtonIsVisible, Converter={StaticResource BoolToVisConverter}}" />
</Window>
来自 MainViewModel 的 ButtonIsVisible 在命令中更改,这可以按预期工作。这就是我的麻烦发生的地方。
另一个视图模型
class AnotherViewModel: ObserveableObject
{
public bool ButtonIsVisible
{
get { return MainModel.ButtonIsVisible; }
set
{
MainModel.ButtonIsVisible = value;
RaisePropertyChanged("ButtonIsVisible");
}
}
}
AnotherViewModel 的一个实例是通过其相应视图的 DataContext 创建的,并且一个命令绑定到此视图中的一个按钮,在该按钮中我从 AnotherViewModel 更改 ButtonIsVisible 属性,此时我希望我的 MainView 中的按钮更改,看到两个 ViewModel 从我的 MainModel 中的静态属性获取和设置相关属性的值,但这不起作用。 谁能告诉我我做错了什么?
【问题讨论】:
-
现在我不能告诉你为什么它不工作,但我真的用静态属性来做这件事听起来很糟糕。我宁愿将
MainViewModelButtonIsVisibleproperty 从AnotherViewModel更改为MainViewModelinstance 在构造函数中发送到AnotherViewModel。 -
现在我想起来了,在
AnotherViewModel中你调用RaisePropertyChanged,但这会影响AnotherViewModel的视图,而不是MainView。MainView没有收到属性更改事件... -
我不得不承认,即使我自己也不喜欢使用静态属性来做到这一点。我可能会在以后找到更好的方法,但我现在就用这个来让球滚动起来。您的第二条评论是有道理的,但是有什么办法可以解决这个问题吗?我可以通知
MainViewModelAnotherViewModel中的更改吗? -
@Howard_Schmidtt 在这里,更好的方法意味着实际可行的方法。您的方法根本不会,因为在一个视图模型中设置属性不会触发另一个视图模型中的 PropertyChanged 事件
-
嗯,有几种方法可以做到这一点,从非常简单到非常复杂。例如,您可以使用 EventHandler 通知主视图它已更改。但我会采用我之前告诉过您的简单解决方案:将 MainViewModel 实例传递给 AnotherViewModel 并从那里更改属性。另外,这样你就可以摆脱那个丑陋的静态属性
标签: c# wpf mvvm binding static