2011-11-25 54 views
1

我有一个菜单按钮,单击时会打开一个窗口。当发生什么事情时更改控件属性 - wpf xaml

我想在点击时更改它的颜色,并在窗口关闭时恢复。

我以为使用触发器来改变它被点击时的颜色,但我怎么知道当窗户关闭以改变颜色回来?

我需要它在MVVM方式,所以我不喜欢用后面

回答

2

与视图模型并行的模式之一是事件聚合器。基本的要点是你创建一个消息总线,允许感兴趣的对象订阅其他对象可能触发的特定事件,而不需要两者之间的直接耦合。

您的主视图模型可能会订阅WindowClosed事件(它提供了一个用于确定哪个特定窗口已关闭的标识符)。当你的对话框关闭时,其视图模型将负责触发事件。

当您的视图模型接收到事件时,它将更新该属性,即您的菜单项的触发器被绑定到。

0

代码你可以使用一个切换按钮,以及绑定到一些布尔维持的状态窗口是否打开的财产器isChecked /关闭。

希望帮助

+0

我怎么知道如果窗口关闭更新布尔属性,如果我使用mvvm – david

0

您可以订阅你的窗口的关闭事件,在该事件中,你可以设置你的任何布尔属性这样的 -

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中更改菜单项的颜色。

+0

坦克的答案,但我搜索xaml/mvvm的方式。我更新了这个问题 – david

1

如果你使用mvvm,那么你希望使用IWindowService来打开你的窗口。如果你这样做,你的viewmodel知道服务/窗口什么时候关闭,你可以使用布尔值绑定到你的触发器。

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> 

现在,当窗口打开按钮的背景颜色将变为黄色,而当它被再次关闭将恢复到它原来的颜色。

相关问题