【发布时间】:2015-04-13 14:28:42
【问题描述】:
我正在尝试寻找一种技术来从其他视图中显示模态视图,但我遇到了问题。这是我正在尝试做的一个简单示例:
共享视图模型
class ClientesViewModel : Screen
{
private bool _deleteconfirmvisible;
public bool DeleteConfirmVisible
{
get { return _deleteconfirmvisible; }
set
{
_deleteconfirmvisible = value;
NotifyOfPropertyChange("DeleteConfirmVisible");
}
}
public void ShowDeleteConfirm()
{
this.DeleteConfirmVisible = true;
}
public ModalViewModel ModalDelete
{
get { return new ModalViewModel(); }
}
public void ConfirmDelete()
{
//Actually delete the record
//WCFService.DeleteRecord(Record)
}
}
第一次查看
<UserControl x:Class="Ohmio.Client.ClientesView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mahapps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:local="clr-namespace:Ohmio.Client"
mc:Ignorable="d"
d:DesignHeight="364" d:DesignWidth="792">
<UserControl.Resources>
<DataTemplate DataType="{x:Type local:ModalViewModel}">
<local:ModalView/>
</DataTemplate>
</UserControl.Resources>
<local:ModalContentPresenter DataContext="{Binding}" IsModal="{Binding DeleteConfirmVisible}" Grid.ColumnSpan="5" Grid.RowSpan="4" ModalContent="{Binding Path=ModalDelete}">
<Grid>
<Button x:Name="ShowDeleteConfirm" Margin="5" Grid.Column="2" Content="Delete Record"/>
</Grid>
</local:ModalContentPresenter>
</UserControl>
第二视图(模态内容)
<UserControl x:Class="Ohmio.Client.ModalView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Ohmio.Client"
mc:Ignorable="d" Height="145" Width="476">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<Label Content="Are you sure you want to delete this record?" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center"></Label>
<Button x:Name="ConfirmDelete" IsDefault="True" Grid.Row="2" Content="Aceptar" Margin="10"></Button>
<Button x:Name="TryClose" IsCancel="True" Grid.Row="2" Grid.Column="1" Content="Cancelar" Margin="10"></Button>
</Grid>
</UserControl>
模态视图模型
class ModalViewModel : Screen
{
public ModalViewModel()
{
}
}
所以基本思想是让两个视图共享同一个视图模型。此视图模型具有显示模式内容和删除记录的属性。
这里的问题是ConfirmDelete 方法永远不会被调用。我想问题是子视图DataContext 与父视图不同。那么我该如何解决呢?
谢谢!
编辑
忘了说,我用的是 Caliburn.Micro
编辑 2
我按照 Rachel 的建议划分视图模型。问题依然存在。这是我的代码现在的样子:
TestViewModel
class TestViewModel :Screen
{
private bool _deleteconfirmvisible;
TestModalViewModel _modaldelete;
public TestViewModel()
{
_modaldelete = new TestModalViewModel();
}
public bool DeleteConfirmVisible
{
get { return _deleteconfirmvisible; }
set
{
_deleteconfirmvisible = value;
NotifyOfPropertyChange("DeleteConfirmVisible");
}
}
public void ShowDeleteConfirm()
{
this.DeleteConfirmVisible = true;
}
public TestModalViewModel ModalDelete
{
get { return _modaldelete; }
}
}
测试视图
<UserControl x:Class="Ohmio.Client.TestView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mahapps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:local="clr-namespace:Ohmio.Client"
mc:Ignorable="d"
d:DesignHeight="364" d:DesignWidth="792">
<UserControl.Resources>
<DataTemplate DataType="{x:Type local:TestModalViewModel}">
<local:TestModalView/>
</DataTemplate>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="40"></RowDefinition>
</Grid.RowDefinitions>
<ContentPresenter Content="{Binding Path=ModalDelete}"></ContentPresenter>
<Button x:Name="ShowDeleteConfirm" Margin="5" Grid.Row="1" Content="Delete Record"/>
</Grid>
</UserControl>
TestModalViewModel
class TestModalViewModel : Screen
{
private Boolean _result;
public TestModalViewModel()
{
_result = false;
}
public void ConfirmAction()
{
_result = true;
TryClose();
}
public bool Result
{
get { return _result; }
}
}
TestModalView
<UserControl x:Class="Ohmio.Client.TestModalView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Ohmio.Client"
mc:Ignorable="d" Height="145" Width="476">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Label Content="Are you sure you want to delete this record?" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center"></Label>
<Button x:Name="ConfirmAction" IsDefault="True" Grid.Row="2" Content="Aceptar" Margin="10"></Button>
<Button x:Name="TryClose" IsCancel="True" Grid.Row="2" Grid.Column="1" Content="Cancelar" Margin="10"></Button>
</Grid>
</UserControl>
我为和 ContentPresenter 更改了 ModalContentPresenter,但问题仍然存在:ConfirmAction 从未被调用,我不明白为什么。谁能告诉我为什么?
编辑 3
窥探结果:
【问题讨论】:
-
我认为您误解了按钮如何与命令挂钩。看看here
-
@user1 我会冒险猜测虚拟机源自
Screen,这就是 Caliburn Micro。 Caliburn 会神奇地将按钮绑定到与按钮同名的方法。 -
感谢您的评论。忘了提我正在使用 Caliburn.Micro 所以我不需要显式创建 ICommand
-
@CharlesMager 啊,好吧,我的错。
-
对视图排列有点困惑。为什么要将 ShowDeleteConfirm 按钮放在 ModalContentPresenter 中?
标签: c# wpf mvvm caliburn.micro