gpt4 book ai didi

wpf - 同步用户控件中多个属性的绑定(bind)

转载 作者:行者123 更新时间:2023-12-05 00:24:19 24 4
gpt4 key购买 nike

我有一个 WPF 用户控件的丑陋竞争条件,它是某种扩展的 ComboBox:
UserControl主要定义了两个可绑定(bind)的DependencyProperties,一个是选中项,另一个是列表,可以从中选择选中项。
两者都是可绑定(bind)的,因此可以使用或不使用选定项来初始化控件,并且可以通过绑定(bind)更改两个属性(在 DataContext 更改时),进一步的选择可能会由于用户交互而更改。
UserControl 包含一个 ComboBox,其 ItemsSource 和 SelectedItem 与我的列表属性和 UserControl 的 SelectedItem 同步 - 到目前为止一切顺利。
现在的问题是,如果在设置具有两个值的新 DataContext 时从外部更改两个属性(准同时),则偶尔会发生 SelectedItem 设置正确但列表更新导致选择被重置为 null 覆盖以前设置的值 -> 破坏了我的 DataContext。

简而言之:我需要找到一种方法在列表更新期间“锁定”我的 SelectedItem - 但仅观察 PropertyChanged-Events 是不够的,因为我在更新后收到它们,而要记住的状态已经丢失。此外,我无法确定,如果选择更改是由用户或(正确)绑定(bind)或(不希望)间接由其他绑定(bind)引起的......
我认为我的 DependencyProperties 需要一些 BeforePropertyChanged 或 OnPropertyChanging 事件——或者另一种方式来管理两个属性同时更新的顺序。

欢迎任何建议:)

请注意,我说的是从中选择项目的列表,但实际上它是一些更复杂的结构,可以快速排序和过滤,这也是我在这里不使用 ItemsControl 的原因,但我不觉得那是与问题相关。

最佳答案

这可能无济于事,而且可能不是正确的方法,但是您谈到了 OnPropertyChanging您的依赖属性的事件。

碰巧当您创建依赖属性时,您可以在 PropertyMetadata 中指定回调。当属性改变时触发,它的 EventArgument 中既有旧值又有新值.

这是带有回调的 Text 属性的示例

public static DependencyProperty TextProperty = DependencyProperty.Register
("Text", typeof(string),
typeof(DecimalTextBox),
new PropertyMetadata("", OnTextPropertyChanged));

最后一个参数是您要查找的参数。 PropertyMetadata 构造函数的第一个参数是属性的默认值。第二个是您注册属性更改时发生的属性更改回调的地方。

在此回调中,您可以处理绑定(bind)以确保不会覆盖数据上下文的 SelectedItem。
private static void OnTextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{

var box = ((TextBox)sender);

if (((string)e.NewValue)==badvalue)
box.Text= e.OldValue);


}

老实说,我不确定这对您的情况有何帮助,因为我仍然不知道如何检查空值是否有效。 (如果有 ItemsSource,我可能会做的不是允许空值,除非 itemssource 正在更改[并且我可能会在 ItemsSource 更改的回调中使用某种标志,一旦选定的项目更改就会重置])。我对异步不是很了解,但是您也许可以在这里设置某种锁定。

u_u

关于wpf - 同步用户控件中多个属性的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024312/

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