3

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

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

欢迎任何建议:)

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

4

1 回答 1

1

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

碰巧的是,当您创建依赖项属性时,您可以PropertyMetadata在属性更改时触发的回调中指定一个回调,该回调在其EventArgument.

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

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

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

在此回调中,您可以处理绑定以确保不会覆盖数据上下文的 SelectedItem。

private static void OnTextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {

        var box = ((TextBox)sender);

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


    }

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

u_u

于 2012-03-19T12:16:14.003 回答