在该对话框的初始值设定项中中止“showDialog”

时间:2016-08-19 17:03:13

标签: c# wpf xaml mvvm

我有一个带有按钮的主窗口,可以调用另一个对话框:

TableView dialog = new TableView();
dialog.ShowDialog();

在该视图的xaml.cs构造函数中,它看起来像这样:

public TableView()
{
    InitializeComponent();
    this.tableViewModel = this.DataContext as TableViewModel;
    this.tableViewModel.CloseAction += this.Close;
}

当然,这会调用视图模型的构造函数,我有时会遇到异常。我已经在视图模型的构造函数(try{}catch{})中处理了这个异常,但是目前TabeView仍然显示(只是看起来很糟糕而没有正确的东西)。为了解决这个问题,我正在使用xaml.cs构造函数:

public TableView()
{
    InitializeComponent();
    this.tableViewModel = this.DataContext as TableViewModel;
    this.tableViewModel.CloseAction += this.Close;

    if (this.tableViewModel.ListOfViewModels == null)
        this.Close();
}

然后dialog.ShowDialog();返回错误(尝试显示已关闭的对话框)。我有一个很好的练习方法吗?也许是一种调用this.Close();的方法,它不会在dialog.ShowDialog();中引发异常?

1 个答案:

答案 0 :(得分:0)

这个问题可以说太宽泛了。你遗漏了很多细节,这为许多可能的解决方案打开了大门。也就是说,我认为有一些基本方法可以解决这个问题:

  1. 不要在视图模型构造函数中捕获异常。让它传播到创建 if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $premio=array("$10.000", "$5.000", "$2.000", "No Aplica"); echo "<tr class='posicion'>"; if ($i < 3) { echo "<td class='line-rows'>" . $premio[$i] . "</td>"; } else { echo "<td class='line-rows'>" . $premio[3] . "</td>"; } echo "<td>" . $row["nombre"] . "</td>"; echo "<td>" . $row["puntos_julio"] . "</td>"; echo "<td>" . $row["puntos_agosto"] . "</td>"; echo "<td>" . $row["puntos_septiembre"] . "</td>"; echo "</tr>"; $i++; } 对象的代码,并在发生异常时让代码不调用TableView
  2. 在视图模型中捕获异常,并为要呈现的视图提供合适的“初始化失败”状态。然后继续并致电ShowDialog()并让对话框显示给用户。 (可选)允许对话框在例如打开对话框之后关闭五秒钟(向用户发出适当的警告,而对话框将关闭)。当然,添加此可选行为将需要视图和视图模型之间的更多协调;你希望视图检查视图模型状态,然后启动一个计时器,之后关闭对话框。
  3. 执行异常抛出初始化之前以创建对话框对象。然后,如果成功,则将其传递给对话框构造函数,然后构造函数可以将其传递给视图模型构造函数。或者,允许在构建之后通过属性设置初始化数据。
  4. 以上内容远不是一个全面的列表,但代表了现在代码状态可能是最理想的解决方案。如果您想要更具体的内容,请提供一个好的Minimal, Complete, and Verifiable code example,以清楚地显示您的方案的样子。