【发布时间】:2020-09-23 10:38:33
【问题描述】:
我正在修改一个现有的 WPF 项目(我对 WPF 没有太多经验),并且我有这个属性:
public Point WidgetMiddlePoint
{
get
{
return new PointByAppMonitorDPI(_middlePoint);
//return _middlePoint;
}
}
在 UI 方面:
<controls1:BorderWithTip.TipOffset>
<MultiBinding Converter="{StaticResource TipOffsetPositionConverter}">
<Binding Path="WidgetMiddlePoint" Delay="500" NotifyOnSourceUpdated="False" NotifyOnTargetUpdated="False"/>
<Binding ElementName="BorderWithTip" Path="ActualWidth" Delay="500" NotifyOnSourceUpdated="False" NotifyOnTargetUpdated="False"/>
</MultiBinding>
</controls1:BorderWithTip.TipOffset>
TipOffsetPositionConverter 根据给定的参数执行一些计算。
我的问题是 WidgetMiddlePoint 值取决于应用程序所在的监视器的 DPI(DPI 与我的问题无关,它只是一个仅在调用 getter 时才考虑的因素的用例)。
所以发生的情况是 UI 从 getter 获取值并且不会刷新该值,除非我使用 setter 将其设置为其他值,然后“通知”。
如何配置 UI 以每次重新获取值,即使它“认为”属性的值没有改变?或者这是不好的做法,不推荐?
【问题讨论】:
-
什么是“每次”?如果值发生变化,为什么不使用 setter 并通知?如果它没有改变,那么就不需要更新。您的要求不清楚。
-
当一个属性的值没有变化时,为什么要向UI提示?
-
我不想使用设置器,因为不应修改“原始”值。当应用程序被拖动到具有不同 DPI 设置的不同监视器时,getter 应根据“原始”值和新监视器的 DPI 返回不同的值。目前,我没有迹象表明 DPI 发生了变化。我可以以某种方式实现 DPI 通知程序,也可以弄清楚 UI 如何每次都获取属性的值。 setter 只会更改一次属性。 getter 将根据当前监视器的 DPI 返回不同的值。希望我的解释清楚......
-
INotifyPropertyChanged允许您执行此操作。您需要以编程方式为您希望 UI 读取的属性引发PropertyChanged事件。
标签: c# wpf inotifypropertychanged