当事情发生时改变控制属性 - wpf xaml

时间:2011-11-25 06:52:10

标签: wpf xaml mvvm triggers styles

我有一个菜单按钮,可以在点击时打开一个窗口。

我希望在单击时更改它的颜色,并在窗口关闭时恢复。

我想在点击时使用触发器来改变它的颜色,但我怎么知道窗口何时关闭以改变颜色?

我需要以mvvm方式使用它,所以我不想使用

背后的代码

5 个答案:

答案 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中使用该属性来更改菜单项的颜色。