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

相關問題