WPF绑定未正确更新

时间:2013-04-29 00:40:31

标签: c# wpf mvvm

我遇到了一段时间以来遇到的最令人沮丧的问题,我已经设置如下,最近它已经无缘无故地停止在客户端计算机上工作(或者没有理由我可以说明我没有改变这个部分中的任何代码都持续了几个月而且这只是在上周才开始发生了)当用户点击编辑时,文本没有变得可见,奇怪的是它在调试,发布时100%工作(使用VS2010)并在我的计算机上安装程序,我很难过,我似乎可以在我自己的计算机上复制。我的问题很简单(albiet有点模糊)任何人都可以指出或告诉我在哪里调试它?

查看模型部分(只是一个典型的绑定):

    private bool _editingSpecifications = false;
    public bool EditingSpecifications
    {
        get { return _editingSpecifications; }
        set
        {
            System.Windows.MessageBox.Show("In EditingSpecifications property PRE: "+value);
            if (_editingTraceSpecifications == value)
                return;
            _editingSpecifications = value;
            base.OnPropertyChanged("EditingSpecifications");
            System.Windows.MessageBox.Show("In EditingSpecifications property POST");
        }
    }

查看:

  <TextBox Visibility="{Binding Path=EditingSpecifications, Converter={StaticResource BoolToVis2}}" Text="{Binding Path=Specifications, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Width="262">...</TextBox>

转换器:

 public class BoolToVisibiltyConverter2 : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(Visibility))
            throw new InvalidOperationException("The target must be a Visibility");
        System.Windows.MessageBox.Show((bool)value + " :BoolToVisibiltyConverter2");
        if ((bool)value)
            return Visibility.Visible;
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((Visibility)value == Visibility.Visible)
            return true;
        return false;
    }
}   

它是一个MVVM设置,其中ViewModel根据需要绑定到视图(即当用户希望编辑等)时,上面的代码是我觉得相关的所有内容(如果你需要更多只是问:)),你可以看到我弹出一些消息框,从中我得到了这个场景:
用户加载第一个查看点击编辑消息框弹出
1)“在EditingSpecifications属性PRE:”+值
2)(bool)值+“:BoolToVisibiltyConverter2”
3)“在EditingSpecifications属性POST中”

一切都按预期工作,但是在加载第二个视图时(请注意,这甚至可能是刚刚关闭并重新打开的相同视图) 1)“在EditingSpecifications属性PRE:”+值
2)(bool)值+“:BoolToVisibiltyConverter2” - 但不是这样,所以在其他方面,转换器不会在第二次以及随后的任何编辑规范的尝试中被调用。
3)“在EditingSpecifications属性POST中”

如果你在同一个盒子上再次点击编辑,你只能得到:
1)“在EditingSpecifications属性PRE:”+值 - 这是预期的。

编辑 - 更多细节 问题是,只有在第一次编辑尝试时,文本框才会变得可见,并且在关闭和打开视图后不会在任何后续请求中显示:/我觉得它与未从ViewModel更新的绑定有关更新请求,但我不能复制它。

重置此功能的唯一方法是关闭并打开程序,正如我之前所说,我只能在客户端计算机上复制此行为,而不是我自己。所以任何人都可以告诉我或指出我在哪里看任何方向。

1 个答案:

答案 0 :(得分:0)

当向后导航到页面时,WPF 4.0中引入了类似的问题:页面将正确显示,但绑定不起作用。解决方法是将View的内容包装到DataTemplate中,以便每次显示View时都会重新实例化View。

您可以尝试的另一件事是将DataContext设置为null,然后再返回ViewModel,以强制重置绑定。

顺便说一句:为什么要编写自己的BooleanToVisibilityConverter? System.Windows.Controls中有一个......

相关问题