글쎄, 네 솔루션은 패턴을 깨고있다. 가장 큰 단점은 윈도우 닫는 것을 방해하는 VM과 로직을 완전히 테스트 할 수 없다는 것입니다. 그러나 대안을 구현하려는 노력이 필요하다면 언제나 그렇듯이 고려해야합니다.
MVVM을 계속 사용하려면 먼저 연결된 SO post에 게시 된 솔루션을 사용할 수 있습니다. 내 게시물의 필수 부분을 여기에 복사했습니다.당신이 볼 수 있듯이
견적
<Window x:Class="AC.Frontend.Controls.DialogControl.Dialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:DialogControl="clr-namespace:AC.Frontend.Controls.DialogControl"
xmlns:hlp="clr-namespace:AC.Frontend.Helper"
MinHeight="150" MinWidth="300" ResizeMode="NoResize" SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterScreen" Title="{Binding Title}"
hlp:AttachedProperties.DialogResult="{Binding DialogResult}" WindowStyle="ToolWindow" ShowInTaskbar="True"
Language="{Binding UiCulture, Source={StaticResource Strings}}">
<!-- A lot more stuff here -->
</Window>
, 나는 xmlns:hlp="clr-namespace:AC.Frontend.Helper"
제 나중에 hlp:AttachedProperties.DialogResult="{Binding DialogResult}"
바인딩 네임 스페이스를 선언하고있다.
[...]
public class AttachedProperties
{
#region DialogResult
public static readonly DependencyProperty DialogResultProperty =
DependencyProperty.RegisterAttached("DialogResult", typeof (bool?), typeof (AttachedProperties), new PropertyMetadata(default(bool?), OnDialogResultChanged));
private static void OnDialogResultChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var wnd = d as Window;
if (wnd == null)
return;
wnd.DialogResult = (bool?) e.NewValue;
}
public static bool? GetDialogResult(DependencyObject dp)
{
if (dp == null) throw new ArgumentNullException("dp");
return (bool?)dp.GetValue(DialogResultProperty);
}
public static void SetDialogResult(DependencyObject dp, object value)
{
if (dp == null) throw new ArgumentNullException("dp");
dp.SetValue(DialogResultProperty, value);
}
#endregion
}
/견적
당신이 필요로하는 유일한 것은 내 솔루션 작업을하기 위해이 같은 VM
이다.
public class WindowVm : ViewModelBase // base class implementing INotifyPropertyChanged
{
private bool? _dialogResult;
public bool? DialogResult
{
get { return _dialogResult; }
set
{
_dialogResult = value;
RaisePropertyChanged(() => DialogResult);
}
}
//... many other properties
}
출처
2013-05-24 07:51:38
DHN