【发布时间】:2015-11-26 03:34:28
【问题描述】:
例如,我有一个 ViewModel 用于弹出控件内的视图。
ManagerView.xaml
<Popup Name="Popup1" AllowsTransparency="True" Placement="Center" PlacementTarget="{Binding ElementName=AGrid}" StaysOpen="True">
<Popup.Style>
<Style TargetType="{x:Type Popup}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsPopupVisible}" Value="True">
<Setter Property="IsOpen" Value="True"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding IsPopupVisible}" Value="False">
<Setter Property="IsOpen" Value="False"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Popup.Style>
<View:AssignView></View:AssignView>
</Popup>
AssignViewModel.cs:
public AssignViewModel()
{
Default = this;
}
public static AssignViewModel Default;
private ICommand iCloseCommand;
.
.
.
private void Close()
{
ManagerViewModel.Default.IsPopupVisible = false;
}
并且ManagerViewModel 也访问AssignViewModel。我通过为每个 ViewModel 分配一个它们自己的静态实例来传递参数。这很好用,但当然存在依赖问题,但这也是因为它们实际上依赖于彼此的值。
任何人都可以建议我没有任何依赖项的设计吗?这只是一个 ViewModel 依赖于我经常遇到的另一个 ViewModel 的实际示例,我正在尝试找出一种将它们解耦的方法。
【问题讨论】:
-
您的问题不清楚,您最终要做什么?可以使用事件删除依赖项。例如,如果我想通过按下按钮对 TextBox 进行一些更改,我会通过处理 Click 事件并在那里更改 TextBox 状态来实现。
-
对不起,使用事件如何消除依赖关系?无论如何,它都会破坏我的 MVVM 模式。为了清楚起见,我正在更新我的问题...
-
使用接口,当打开一个Popup时,将Popup实例存储在接口类型变量中。然后您可以通过调用接口方法轻松关闭此弹出窗口。 IPopup 弹出 = Popup1; popup.Close();
-
我想知道你为什么想要
IsPopupVisible属性。对我来说完全是无稽之谈。您可以在 Popup 类上使用Activity模式,或者您可以使用 EventAggregator/MessageBus 模式,具体取决于用例。