gpt4 book ai didi

WPF ComboBox MVVM 奇怪的行为

转载 作者:行者123 更新时间:2023-12-02 08:54:35 25 4
gpt4 key购买 nike

当我将组合框关联到我的 View 模型时,我出现了奇怪的行为。行为如下,当我更改组合的选定值时,我会对新值进行验证,如果这个新值无效,我将保留旧值并丢弃新值,这样我就不会提出Inotifypropertychanged,但无论如何都会调用与组合框关联的属性的 getter,这会获取我想要显示的旧值,但组合框显示新值,即使组合的 selectedvalue 作为旧的正确值,我在 Debug模式下检查过。我不知道如何解决这个问题,因为我从未见过这种行为,任何建议将不胜感激。

这是XAML的代码

<ComboBox Height="23" Name="cbxStatus" HorizontalAlignment="Left"
ItemsSource="{Binding Path=Status, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=SelectedStatus, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Value" Width="130" VerticalAlignment="Center"
IsEnabled="{Binding Path=StatusEnable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

这是 View 模型代码,属性

public Config SelectedStatus
{
get
{
if (ApplicationAction == ApplicationAction.Add)
{
base.Object.State = configManager.BudgetInitStatus();
StatusEnable = false;
}
else
{
StatusEnable = true;
}
return base.Object.State;
}
set
{
if (base.Service.CanChangeBudgetStatus(base.Object, value))
{
base.Object.State = value;
base.Object.IsDirty = true;
}
RaiseOnPropertyChanged("SelectedStatus");
RaiseOnPropertyChanged("AssociateOrderButtonVisibility");
}
}

感谢您的帮助

最佳答案

正如我对 Jay 的评论中所指出的,这里的问题是 WPF 正在设置该值,但没有监听您的更改通知(毕竟这是所期望的)。您需要做的是在当前消息的上下文之外引发属性更改通知。您可以使用调度程序来执行此操作,例如:

set
{
if (!valid)
{
// value is unchanged
Dispatcher.BeginInvoke(delegate { this.OnPropertyChanged(...) });
return;
}

// value is changed here
}

这将确保执行当前的数据绑定(bind)消息,然后一条单独的消息告诉 WPF,“实际上,您刚刚提供给我的 setter 的值不再是当前值”。

如果您愿意,也可以使用SynchronizationContext。不管怎样,我承认这有点老套。不幸的是,我不知道解决这个问题的好方法。事实上,WPF 假定它传递给 setter 的值是属性的有效值。绑定(bind)操作上下文中的任何属性更改通知都无法说服它。

关于WPF ComboBox MVVM 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com