【发布时间】:2014-02-18 11:33:56
【问题描述】:
我快被这个 bug 搞疯了,所以我真的需要帮助。
在捕获异常时,我应该显示一个包含网格的“消息框”(使用网格),但是在将数据上下文显式设置为网格之后,它仍然没有显示消息框.
XAML 代码:
<Grid x:Name="gridBackground" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" Visibility="{Binding BackgroundVisibility}" Background="#FFB4B4B4" Opacity="0.7"></Grid>
<Grid x:Name="gridWarningMessages" HorizontalAlignment="Center" VerticalAlignment="Center" MinWidth="500" MinHeight="200" MaxWidth="600" MaxHeight="600" Visibility="{Binding WarningMessagesVisibility}">
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" VerticalAlignment="Center" Foreground="Black" Margin="50" FontSize="29.333" TextAlignment="Center" x:Name="txtWarningMessages" Text="{Binding WarningOrErrorMessage}" FontFamily="Assets/helvetica-neue-thin-1361522098.ttf#HelveticaNeue"></TextBlock>
</Grid>
ViewModel 属性:
private string warningOrErrorMessage;
public string WarningOrErrorMessage
{
get { return warningOrErrorMessage; }
set
{
if (warningOrErrorMessage != value)
{
warningOrErrorMessage = value;
Notify("WarningOrErrorMessage");
}
}
}
private Visibility warningMessagesVisibility;
public Visibility WarningMessagesVisibility
{
get { return warningMessagesVisibility; }
set
{
if (warningMessagesVisibility != value)
{
warningMessagesVisibility = value;
Notify("WarningMessagesVisibility");
}
}
}
private Visibility backgroundVisibility;
public Visibility BackgroundVisibility
{
get { return backgroundVisibility; }
set
{
if (backgroundVisibility != value)
{
backgroundVisibility = value;
Notify("BackgroundVisibility");
}
}
}
将数据上下文显式设置为网格并在页面初始化时“隐藏”它们的代码:
var context = (SubmittedOrdersViewModel)DataContext;
gridWarningMessages.DataContext = context;
gridBackground.DataContext = context;
context.BackgroundVisibility = Visibility.Collapsed;
context.WarningMessagesVisibility = Visibility.Collapsed;
应该在捕获异常后显示网格的代码(在视图模型中,通过 ICommand..)(请注意注释的“通知”行,我已尝试在属性上设置值后显式触发通知但仍然有同样的问题):
private void deleteSelectedOrder(object param)
{
try
{
throw new Exception("");
//working code to delete the order goes here
}
catch (Exception)
{
WarningOrErrorMessage = "An error occurred while trying to delete this order.";
Notify("WarningOrErrorMessage");
BackgroundVisibility = Visibility.Visible;
//Notify("BackgroundVisibility");
WarningMessagesVisibility = Visibility.Visible;
//Notify("WarningMessagesVisibility");
}
}
请,请帮助我。 :(谢谢!
【问题讨论】:
-
不是绑定到可见性变量,而是绑定到布尔值,然后使用布尔可见性转换器
-
无法复制问题。您的代码在这里运行良好(使用作为 DataContext 而不是
SubmittedOrdersViewModel的代码隐藏进行测试)。并且为两个网格显式设置 DataContext 似乎没用,默认情况下应该继承父级的 DataContext。 -
你需要检查的是绑定,要么提供一些 dummyconverter 来调试 throwed,要么在调用 Notify 后调试你的属性的 get{},或者使用 Snoop 并检查任何绑定错误。跨度>
-
您的
gridWarningMessages似乎是另一个网格的子级,但现在正在设置Grid.Row和Grid.Column。这是故意的吗?也许它正在显示,但其他一些控件重叠,从而使其“不可见”?
标签: c# wpf xaml mvvm windows-8.1