2010-11-18 50 views
2

我试图找出这一个问题时遇到了一点问题......在WPF中使用MVVM模式,我们的C#模型发生事件说事情发生了。我希望能够在ViewModel中处理该事件,然后启动故事板或更改当前Xaml页面上隐藏面板的可见性。这必须在没有代码隐藏的情况下处理。WPF:如何处理模型中的事件以动态更新MVVM中的xaml

我可以在我的ViewModel中同步事件,更新属性以说明该事件的名称是什么,并且甚至会触发NotifyPropertyChanged,但是如何获取该事件以启动故事板或映射到布尔真/我的网格的可见性属性为false?我绑定到hs作为不同网格的事件名称的属性可能会基于不同的事件显示,所以我需要一种将其映射到布尔值的方法。然而,理想的解决方案是启动故事板。我看过DataTriggers,但它们似乎都链接到样式,而不是实际页面。

任何想法,我可以如何实现这一目标?

谢谢!

回答

0

将Xaml中网格的Visibility属性绑定到ViewModel上的布尔属性。

<Grid Visibility="{Binding Path=VisiblePropertyOnViewModel}"> 

现在,您可以在ViewModel中执行任何操作并设置属性。只要它做INotifyPropertyChanged或是一个DependencyProperty,它就可以工作。

我不得不做更多的挖掘来弄清楚如何启动一个故事板,但我毫不怀疑它几乎一样容易。我相信,故事板可以被PropertyTriggers踢开。我会离开这个让你开始。

+0

感谢您的答案戴夫 - 真的很感激它!问题是这个属性不是一个布尔值。这是一个字符串。基本上有一大堆事件可能发生(实际上有好几百个!),所以我想更多的是松散地输入这些信息,让Xaml做一些事情: - 所以表达式的计算结果为true,并将可见性设置为true ... – Slippy 2010-11-18 18:09:41

+0

可见性有3个可能的值,您需要一个转换器将其绑定到布尔值并选择true/false手段为折叠/隐藏/可见。 – Matthieu 2010-11-18 18:11:55

+0

干杯Matthieu - 我希望避免一个转换器,因为我有一个无尽的无限的事件列表。如果你想做任何表情评估,我想转换器必须被使用。 – Slippy 2010-11-18 18:17:59

1

我已经在过去使用此揭开序幕故事板代码隐藏

Storyboard animation = (Storyboard)this.FindResource("ShowPanelStoryboard"); 
animation.Begin(); 

此代码去查看后面,而不是在视图模型。就个人而言,我不介意我的View背后的一些代码,只要它与View相关即可。在我使用这个项目的过程中,我添加了一个监听器到VisibilityChanged事件中,当它变成Visible时,我跑了故事板。

至于显示您的弹出窗口,有几种方法。我最喜欢的之一就是将一个IsPopupShown属性添加到ViewModel,将我的面板的可见性绑定到它,并在任何时候显示弹出窗口时将其设置为true。 ViewModel然后处理触发显示或不显示弹出窗口的事件。

Dave White建议的替代方法是使用转换器。如果你的值不总是真/假,那么你可以创建一个转换器来检查绑定值是否等于ConverterParameter,并返回一个Visibility值。

+0

谢谢蕾切尔 - 我在这里唯一的问题是我根本没有代码。我正在纯粹使用松散Xaml :(我也许会看看Convertor的路线,看看它是否可以工作。感谢您的回应。真的很感谢! – Slippy 2010-11-22 11:26:45

1

从您的评论,在我看来,你可能想要做的就是在你的视图模型中显示Eventobject类型的属性。当视图模型接收到事件时,它将Event设置为适合于该事件的类型的对象。在XAML中,你有这样的:

<ContentControl Content="{Binding Event}"/> 

,并在资源字典定义为DataTemplate要显示的每个特定类型的事件。如果Event为空,则不显示任何内容。如果Event包含您为DataTemplate定义的对象,则会使用该模板显示该对象。

是的,你需要为每种类型的事件创建一个类(如果你还没有的话)。

另一种方式是实现穷人的模板选择:

<TextBlock Text="This is displayed if Foo contains 'BAR'"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Property="Foo" Value="BAR"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 
<TextBlock Text="This is displayed if Foo contains 'BAZ'"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Property="Foo" Value="BAZ"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

这是一种愚蠢冗长,但它是一个简单的方法来处理大量的互斥显示选项。

+0

感谢Robert - 这听起来完全可行。通过例子来看看是否有窍门。谢谢你的答案! – Slippy 2010-11-22 11:25:00

相关问题