【问题标题】:Another MVVM Visibility property that's not updating另一个未更新的 MVVM 可见性属性
【发布时间】: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.RowGrid.Column。这是故意的吗?也许它正在显示,但其他一些控件重叠,从而使其“不可见”?

标签: c# wpf xaml mvvm windows-8.1


【解决方案1】:

刚刚发现有一段代码在页面初始化时直接在控件的属性上显式设置了可见性属性:

gridWarningMessages.Visibility = Visibility.Collapsed;
gridBackground.Visibility = Visibility.Collapsed;

所以我删除了该代码并改为更改视图模型绑定属性:

context.BackgroundVisibility = Visibility.Collapsed;
context.WarningMessagesVisibility = Visibility.Collapsed;

它现在正在工作。

WPF 专家,请随时发表评论。您是否遇到过这样的场景,即显式设置控件属性而不是 viewmodel 属性的值会弄乱代码?

感谢那些花时间审查我的代码的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2020-11-12
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多