use*_*416 1 c# wpf button mvvm caliburn
我正在使用 Caliburn 框架在 WPF 中重写一个项目。我来自 C++ 世界,所以即使是最简单的事情也有一些困难......
所以,假设我有:MainView、MainViewModel、DialogView、DialogViewModel。
在 MainView.xaml 中:...
<MenuItem Name="Dialog" Header="Dialog"></MenuItem>
Run Code Online (Sandbox Code Playgroud)
... Caliburn 将其绑定到 MainViewModel 中的一个方法:
public void Dialog()
{
dynamic settings = new ExpandoObject();
settings.WindowStartupLocation = WindowStartupLocation.Manual;
_windowManager.ShowWindow(new DialogViewModel(_windowManager), null, settings);
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,弹出对话框。
现在,在这个对话框中,我有:
<TextBox Name="Dimension1"/>
<TextBox Name="Dimension2"/>
Run Code Online (Sandbox Code Playgroud)
加上,其他文本框,复选框等。然后有确定和取消按钮:
<Button Content="OK" Name="OK"></Button>
<Button Content="Cancel" Name "Cancel"></Button>
Run Code Online (Sandbox Code Playgroud)
现在,就像现在一样,它们绑定到 DialogViewModel 中的 OK() 和 Cancel() 方法,我无法弄清楚或找到有关如何在 DialogViewModel 中处理它们的信息。
我在创建 DialogResultsAction 类时找到了一个示例,我可以将 OK/Cancel 按钮与此类中的方法绑定,但无法理解如何进一步进行...
你能建议我应该往哪个方向走吗?
我不确定这是否是您要查找的内容,但您可以像对待任何其他屏幕一样对待 DialogViewModel。在这个例子中,Ok 和 Cancel 被绑定到各自的方法。从技术上讲,您可以设置x:Name="TryClose"取消按钮的名称,但我在本示例中将其命名为 Cancel。
在 ShellViewModel 的 Open 方法中,您可以在显示对话框之前在对话框上预设值。在返回结果后,因为您有对它的引用,您还可以读取这些值。
ShellViewModel 中的打开方法:
public void Open()
{
var dialogViewModel = IoC.Get<DialogViewModel>();
dialogViewModel.Dimension1 = "123";
dialogViewModel.Dimension2 = "456";
var result = WindowManager.ShowDialog(dialogViewModel);
if (dialogViewModel.MyDialogResult == DialogResult.OK) return;
//do stuff with results
var dim1 = dialogViewModel.Dimension1;
}
Run Code Online (Sandbox Code Playgroud)
对话框视图:
<Grid>
<StackPanel>
<TextBlock x:Name="Dimension1" />
<TextBlock x:Name="Dimension2" />
</StackPanel>
<StackPanel Height="50"
Orientation="Horizontal">
<Button x:Name="Ok"
Content="Ok" />
<Button x:Name="Cancel"
Content="cancel" />
</StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)
对话框视图模型:
[Export(typeof (DialogViewModel))]
public class DialogViewModel : Screen
{
private string _dimension1;
public string Dimension1
{
get { return _dimension1; }
set
{
_dimension1 = value;
NotifyOfPropertyChange(() => Dimension1);
}
}
private string _dimension2;
public string Dimension2
{
get { return _dimension2; }
set
{
_dimension2 = value;
NotifyOfPropertyChange(() => Dimension2);
}
}
public void Ok()
{
//Do stuff
MyDialogResult = DialogResult.OK;
TryClose();
}
public void Cancel()
{
MyDialogResult = DialogResult.Cancel;
TryClose();
}
}
Run Code Online (Sandbox Code Playgroud)