2010-07-21 126 views
0

如果我有一個集合綁定到n togglebuttons在一個用戶控件中的stackpanel ....我怎麼能更新底層沒有代碼背後的集合(包括檢查和未檢查事件)和完整的更新邏輯?ToggleButton binding

感謝,

U.

回答

1

你的問題含糊不清,但我明白爲什麼這是(商業的東西)。因此,我們只能猜測問題可能是什麼。

我會盡我所能...

這聽起來好像要7周的ToggleButtons,每個按鈕開啓/關閉一週中的一天。您擁有7個布爾值的集合。每個ToggleButton的IsChecked屬性都綁定到集合中的一個布爾值。

問題是,此刻,您正嘗試更改集合中的對象,而不僅僅是該對象的屬性。我不知道是否支持某些位置的項目的直接交換,或者不支持我的ObservableCollection,但是WPF綁定框架當然可能不支持集合中對象的直接交換。您可以添加和刪除項目,但不能在某些位置進行直接交換。

但是,您可以解決此(可能)限制。

嘗試創建一個實現INotifyPropertyChanged像這樣一個新的類:

class BooleanWrapper : INotifyPropertyChanged 
{ 
    private Boolean isSelected; 
    public Boolean IsSelected 
    { 
    get { return isSelected; } 
    set 
    { 
     if (isSelected != value) 
     { 
     isSelected = value; 
     // TODO: Raise PropertyChanged event. 
     } 
    } 
    } 
} 

(如果你不熟悉INotifyPropertyChanged的它很簡單 - 有MSDN上的大量實例它允許綁定框架來檢測財產更改)

而不是有一個ObservableCollection <布爾>,有一個ObservableCollection <布爾值處理程序>。每個ToggleButton的IsChecked屬性應該綁定到BooleanWrapper的IsSelected屬性。

現在,您並未嘗試交換對象進出集合,而只是更新集合中對象的屬性值。

作爲一個側面說明,如果你只綁定到一週的日子,在我看來沒有什麼錯結合就像一個類:

class DaySelection : INotifyPropertyChanged 
{ 
    public Boolean IsMondaySelected { ... } 
    public Boolean IsTuesdaySelected { ... } 
    ... 
} 

這應該給你沒有問題,但是這並且我可能在我的精神需求捕獲中犯了錯誤 - 請忽略它與你想要的無關。

我希望我已經有所作爲了!

+0

非常感謝,這將是非常有用的布爾更新問題.....但是我的問題不是布爾人本身更新這很好,其集合正在更改視圖中這些更改沒有路由到設置綁定的原始集合。 例如 – urema 2010-07-22 07:12:16

+0

Binding b = new Binding(paramName){Source = WorkItem}; b.Mode = BindingMode.TwoWay; 現在我將這個綁定設置爲包含7個togglebuttons的自定義用戶控件的依賴項屬性。 DaySelector.SetBinding(DaySelector.WeekProperty,b); 現在,當在用戶控件和視圖中更改WeekProperty依賴屬性時,WorkItem(綁定的源)的paramName不會被通知這樣的更改.......我還被告知,已選中和未選中不需要按鈕上的事件。 謝謝你。 – urema 2010-07-22 07:15:08

0

看一看TwoWay結合模式。這將允許基礎業務對象由UI進行更新以及通過基礎業務對象更新UI。

+0

邁爾從那個隊友...得到了我通過收集綁定到7個togglebuttons(這些按鈕應該沒有邏輯,即選中或未選中)的兩種方式...底層集合如何更新? 我認爲集合與collectionchanged路由事件的包裝應該工作,但我不能讓這項工作沒有黑客。 謝謝U. – urema 2010-07-21 14:46:01

0

爲了利用集合進行綁定,您需要查看ObservableCollection<T>MSDN link)。通過使用它,你應該自動訂閱你正在尋找的大部分綁定。如果您碰巧使用的是bool以外的其他對象,則必須在您決定綁定的任何對象上實施INotifyPropertyChanged

+0

我知道了,我已經這樣做了....再次,這沒有幫助沒有代碼背後的更新.......例如,如果你有ObservalbeCollection 綁定到togglebuttons的對象,大多數人將有一個Checked和Unchecked事件關聯,並在那裏處理....我不想要這些事件,也不應該需要它們(所以我告訴)。如果我有一個名爲ArrayBool的對象,它接受DayOfWeek的枚舉,並將此DayOfWeek轉換爲ArrayBool ....(接下頁) – urema 2010-07-21 15:31:24

+0

然後我有一個具有ArrayBool的依賴屬性的對象,並且在這裏將我的togglebuttons綁定到布爾值在我的ArrayBool .....現在我不想要任何更新邏輯的事件中選中和未選中,而是我想它,以便我的集合(ArrayBool)委託和觀看集合(以及togglebuttons)並通知其他人都在改變。 感謝您的意見。 U. – urema 2010-07-21 15:31:52

+0

您能否包含您在源集合和綁定中使用的代碼?可能只是你錯過了像NotifyOnSourceUpdated或BindsDirectlyToSource這樣的綁定屬性。 – 2010-07-21 15:53:53