2 回答

TA貢獻1836條經驗 獲得超3個贊
您應該使用AttachProperty關閉窗口。
public static class Attach
{
#region CloseProperty
public static DependencyProperty WindowCloseProperty = DependencyProperty.RegisterAttached("WindowClose",
typeof(bool), typeof(Attach),
new UIPropertyMetadata(false, WindowClosePropertyChangedCallback));
private static void WindowClosePropertyChangedCallback(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs eventArgs)
{
var window = (Window)dependencyObject;
if (window != null && (bool)eventArgs.NewValue)
window.Close();
}
public static bool GetWindowClose(DependencyObject obj)
=> (bool)obj.GetValue(WindowCloseProperty);
public static void SetWindowClose(DependencyObject obj, bool value)
{
obj.SetValue(WindowCloseProperty, value);
}
#endregion
}
并在 XAML 中
<Window x:Class="MyProject.MyWindow"
xmlns:helper="clr-namespace:MyProject.Helper;assembly=MyProject"
helper:Attach.WindowClose="{Binding IsWindowClose}">
并且在 ViewModel 當您將 IsWindowClose 設置為 true 時關閉窗口
public bool IsWindowClose
{
get => _isWindowClose;
set => SetProperty(ref _isWindowClose, value);
}

TA貢獻1111條經驗 獲得超0個贊
如何從此方法執行 onCloseCommand() ?
您有多種選擇,例如創建一個附加行為,在一定的超時后關閉窗口,并使用 xaml 中的行為,從而有效地將視圖模型排除在外。
我建議您在視圖模型中對窗口的 Loaded 事件做出反應并存儲窗口并在以后想要關閉它時使用它。
<Window x:Class="MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
mc:Ignorable="d">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding WindowLoadedCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<!--- the rest of the window here --->
</Window>
但是讓我向您推薦這個答案,以獲取一種對 mvvm 更友好且更重要的是可測試的方法來從查看模型:
使窗口實現一個接口并存儲和使用它(不是完整的Window)!
因此 WindowLoadedCommand 的類型為 DelegateCommand<IClosable> 并將 IClosable 存儲在字段中。發生超時時,從字段中獲取 IClosable 并調用 Close。
- 2 回答
- 0 關注
- 234 瀏覽
添加回答
舉報