3

我有一个丑陋的竞争条件与WPF usercontrol,这是一种扩展组合框: UserControl主要定义两个可绑定的DependencyProperties,一个是选定的项目,另一个是一个列表,从中可以选择所选项目。 两者都是可绑定的,因此可以使用或不使用选定的项目来初始化控件,并且可以通过绑定(在DataContext更改上)更改这两个属性,此外,由于用户交互,选择可能会更改。 UserControl包含一个ComboBox,其ItemsSource和SelectedItem与我的listControl属性和UserControl的SelectedItem同步 - 迄今为止非常好。 现在的问题是,如果两个属性都从外部更改(准同时)时设置一个新的DataContext与两个值设置,它偶尔会发生SelectedItem设置正确,但列表更新导致选择被重置为空覆盖之前设置的值 - >破坏我的DataContext。为了简短起见:我需要找到一种方法来在列表更新期间“锁定”我的SelectedItem - 但只是观察PropertyChanged-Events是不够的,因为我在更新后收到它们,其中要记住的状态是已经失去了。此外,我不能确定,如果选择更改是由用户或(正确地)绑定或(不需要)由其他绑定间接引起的...我想我需要一些BeforePropertyChanged或OnPropertyChanging事件为我的DependencyProperties - 或另一种方式来管理两个属性的同时更新的顺序。同步用户控件中的多个属性的绑定

任何建议表示欢迎:)

注意,我讲一个列表来选择一个项目,但实际上它是一些更复杂的结构,它可以快速分类和过滤,这也是我为什么不是这个原因在这里使用ItemsControl,但我不认为这与问题相关。

+0

您是否设法解决了这个问题?我有一个类似的问题,我正在挖掘.. – 2010-06-14 13:16:48

+0

还没有反应,你可以看到。 我已经做了,确保绑定始终按照正确的顺序(在XAML中)使用,首先是ItemsSource,然后是SelectedItem。但是这看起来不够健壮,特别是如果您重新使用控件来更改DataContext。 – 2010-06-15 08:16:57

+0

另外一个补充:我已经为我的项目源绑定尝试过“IsAsync”。现在我再次将它们全部设置为IsAsync = False,它似乎保证* my *的正确顺序。 不过,我认为了解其他同步技术会很有趣,因为可能会有更复杂的场景,您仍然需要它们。 – 2010-06-16 08:15:43

回答

1

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

恰巧碰巧当你创建依赖属性时,你可以在PropertyMetadata中指定一个回调,当属性发生变化时触发,该属性在EventArgument中同时包含旧值和新值。

这里是一个回调

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

最后一个参数是你正在寻找一个Text属性的一个例子。 PropertyMetadata构造函数的第一个参数是该属性的默认值。第二个是注册属性发生更改时发生的属性changed回调的位置。

在此回调中,您可以处理绑定以确保不会覆盖您的datacontext的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中的某种标志改变的回调,一旦selecteditem被改变,重置])。我并不是很了解异步,但是你也许可以在这里放置某种锁。

u_u

+0

同时,我以不同的方式解决了这个问题,但使用coercevaluecallback可能对我有所帮助,并符合我的要求,所以它回答了我的问题。谢谢。 – 2013-08-21 08:31:04

+0

你是如何解决它的?请添加您使用的答案,而不是将其标记为正确答案。 – 2014-11-24 06:19:57

相关问题