我有一个菜单按钮,可以在点击时打开一个窗口。
我希望在单击时更改它的颜色,并在窗口关闭时恢复。
我想在点击时使用触发器来改变它的颜色,但我怎么知道窗口何时关闭以改变颜色?
我需要以mvvm方式使用它,所以我不想使用
背后的代码答案 0 :(得分:2)
与视图模型齐头并进的模式之一是Event Aggregator。基本要点是,您创建一个消息总线,允许感兴趣的对象订阅其他对象可能触发的特定事件,而不需要两者之间的直接耦合。
您的主视图模型可能订阅了一个WindowClosed事件(它提供了一个标识符,用于确定哪个特定窗口已关闭)。对话框关闭后,其视图模型将负责触发事件。
当你的视图模型收到事件时,它会更新属性,你的菜单项的触发器被绑定。
答案 1 :(得分:1)
如果您使用mvvm,那么您希望使用IWindowService来打开您的窗口。如果这样做,你的viewmodel知道服务/窗口何时关闭,你可以使用布尔值绑定到你的触发器。
答案 2 :(得分:1)
我假设您正在实例化并且ViewModel中的第二个窗口绑定到按钮的Command
属性。这通常是在MVVM中处理这种情况的方式。这允许您在ViewModel中创建另一个属性,用于查询窗口是否打开。
private Window _secondWindow = null;
public bool SecondWindowIsOpen
{
get { return _secondWindow != null; }
}
然后在您的XAML中,您可以将按钮的BackgroundColor绑定到此属性,并使用触发器来确定颜色。
<Window.Resources>
<Style x:Key="WindowIsOpenButtonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding SecondWindowIsOpen}" Value="True">
<Setter Property="Background" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Button Background="Yellow" Command="{Binding OpenSecondWindow}" Style="{StaticResource WindowIsOpenButtonStyle}" />
</Grid>
现在,当窗口打开时,按钮的背景颜色将变为黄色,当它再次关闭时,它将恢复为原始颜色。
答案 3 :(得分:0)
您可以使用togglebutton,将IsChecked属性绑定到某个布尔值,该布尔值维护窗口是否打开/关闭的状态。
希望有所帮助
答案 4 :(得分:0)
您可以订阅窗口的已结束事件,在这种情况下,您可以设置您的任何bool属性 -
private void Border_MouseEnter(object sender, MouseEventArgs e)
{
Window w = new Window();
w.Closed += new EventHandler(w_Closed);
}
void w_Closed(object sender, EventArgs e)
{
// Set your property here to true
}
简单地说,您可以在Trigger
中使用该属性来更改菜单项的颜色。