【问题标题】:PropertyChanged event not changing UI for binding using converterPropertyChanged 事件未更改 UI 以使用转换器进行绑定
【发布时间】:2026-02-02 23:00:02
【问题描述】:

我有下面的“画布”xaml...我想改变它的可见性取决于属性的变化。

XAML:

<d1:BooleanToVisibilityConverter x:Key="BoolToVis" />

Visibility="{Binding Path=IsVisible, Converter={StaticResource BoolToVis}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

我在 ViewModel 中有这个 Visibility 属性

private bool _isVisible;
    public bool IsVisible
    {
        get { return _isVisible; }
        set
        {
            _isVisible = value;
            RaisePropertyChanged("IsVisible");
        }
    }

这是我的转换器代码:

class BooleanToVisibilityConverter : IValueConverter
{
    public BooleanToVisibilityConverter() { }
    #endregion

    #region Properties
    public bool Collapse { get; set; }
    #endregion

    #region IValueConverter Members
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool bValue = (bool)value;
        if (bValue)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
            //if (Collapse)
            //    return Visibility.Collapsed;
            //else
            //    return Visibility.Hidden;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //Visibility visibility = (Visibility)value;

        //if (visibility == Visibility.Visible)
        //    return true;
        //else
        //    return false;
        return value;
    }
    #endregion
}

在调试时,我观察到我的 Setter 正在更改属性值,但它没有在我的转换器上达到断点。转换器仅在加载窗口时最初受到打击。之后,即使属性更改,它也不会被触发。

【问题讨论】:

  • 属性更改是否正确?也就是说,是通过属性设置的,而不是直接针对字段设置的吗?您还没有向我们展示该代码。
  • 我正在使用 Prism 属性更改事件,命名空间 Microsoft.Practices.Prism.ViewModel { [Serializable] public abstract class NotificationObject : INotifyPropertyChanged { protected NotificationObject();公共事件 PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(Expression> propertyExpression); protected void RaisePropertyChanged(params string[] propertyNames);受保护的虚拟 void RaisePropertyChanged(string propertyName); }
  • 谢谢,但这不是我问的。我问您如何更新 IsVisible 属性(您是否不小心设置了字段而不是属性?)
  • 我正在为事件聚合器方法之一执行此操作 if(carStatus = "Reserved") this.IsVisible = true;否则 this.IsVisible = false;

标签: wpf


【解决方案1】:

我了解到您正在使用 Prism,因此请尝试以这种形式更改您的 RaisePropertyChanged:

RaisePropertyChanged(() => IsVisible);

【讨论】:

  • 这与我的视图模型有什么关系。上面的代码用于子视图模型 B..它充当父视图模型 A 的可观察集合。最初我通过调用 B 的新实例从 A 设置属性。
  • 所以,我认为您发布的代码部分没有错误。另一部分肯定有问题,但没有代码很难帮助你。也许你有一个绑定错误,但是无法找到它的代码。看看输出窗口有没有建议?