代码之家  ›  专栏  ›  技术社区  ›  Simon D.

同步UserControl中多个属性的绑定

  •  3
  • Simon D.  · 技术社区  · 16 年前

    我对WPF用户控件有一个丑陋的竞争条件,它是某种扩展的组合框: UserControl主要定义两个可绑定的DependencyProperties,一个是selected item,另一个是list,可以从中选择selected item。 两者都是可绑定的,因此可以使用或不使用所选项初始化控件,并且可以通过绑定(在DataContext更改时)更改这两个属性,此外,由于用户交互,选择可能会更改。 UserControl包含一个组合框,其ItemsSource和SelectedItem与UserControl的my list属性和SelectedItem同步-目前为止还不错。

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

    有什么建议欢迎:)

    请注意,我谈到了一个列表来选择一个项目,但实际上它是一个更复杂的结构,允许快速排序和筛选,这也是为什么我在这里不使用ItemsControl的原因,但我觉得这与问题无关。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jason Ridge    14 年前

    这可能无助于这种情况,而且可能不是正确的方法来做到这一点,但是你谈到了一个问题 OnPropertyChanging 依赖项属性的事件。

    PropertyMetadata 当属性更改时激发,该属性的属性中同时包含旧值和新值 EventArgument .

    下面是一个带有回调的文本属性的示例

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

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

    在这个回调中,您可以处理绑定以确保不会覆盖datacontext的SelectedItem。

    private static void OnTextPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
    
            var box = ((TextBox)sender);
    
            if (((string)e.NewValue)==badvalue)
                    box.Text= e.OldValue);
    
    
        }
    

    乌乌

    推荐文章