2014-01-29 60 views
2

我很困惑這可能是微不足道的事情。我有LayoutGroupDevExpresses類的一個子我自定義屬性(不應有任何區別IMO):自定義WPF綁定不更新列表框選擇

public class ExpandableLayoutGroup : LayoutGroup 
{ 
    public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register("IsExpanded", typeof(Boolean), typeof(ExpandableLayoutGroup)); 

    public Boolean IsExpanded 
    { 
     get { return (Boolean) GetValue(IsExpandedProperty); } 
     set 
     { 
      expandCheckBox.IsChecked = value; 
      SetValue(IsExpandedProperty, value); 
     } 
    } 
} 

然後,我必須XAML結合(含2項在這個時候)列表框稱爲listStates

<ExpandableLayoutGroup x:Name="groupTool" IsExpanded="{Binding SelectedValue.IsTool, ElementName=listStates}" DataContext="{Binding Tool}" Header="Tool" View="GroupBox" /> 

對象列表結合listStates同時包含屬性(簡單):

public class State 
{ 
    public Boolean IsItemTool { get; private set; } 
    public Tool Tool { get; private set; } 
} 

我失去了一些東西明顯?因爲我期望當我更改列表框選擇(單個)時,它也會更新組中的IsExpanded屬性。我有更多的子屬性的工具綁定(由DataContext="{Binding Tool}"明顯)和那些更新很好。因此,DataContext在列表框選擇上正確更改。除了這一個屬性IsExpanded(這應該展開/摺疊佈局組)。

我做錯了什麼,以及如何做到這一點,當列表框發生變化時,IsExpanded綁定被輪詢從IsTool獲取值,並將設置它(取決於選擇)。

回答

2

getter和依賴屬性的制定者只能包含GetValueSetValue電話,因爲這裏有兩種方法來獲取和設置它們的值:使用getter和setter和使用DependencyPropertyDependencyPropertyKey。這就是爲什麼你的setter中的代碼沒有執行(綁定不會將它們用於依賴屬性)。如果您希望在更改值時執行某些代碼,請在PropertyMetadata中將其指定爲PropertyChangedCallback回調。

請參閱PropertyChangedCallback Delegate on MSDN

+0

我.. ..被定罪。我有回調設置,但它從來沒有被調用,因爲屬性中的其他代碼。現在它真的被召喚了。我從來不知道該屬性必須是空的(SetValue/GetValue除外)。現在我明白了。讓我進行一些測試,然後我會接受你的答案。 – SmartK8

+0

它的工作,完美。謝謝。 – SmartK8

1

依賴項屬性的setter只能設置它的基礎類型的值。 .NET內部機構保留直接調用SetValue()的權利(並且根據我的經驗,WPF通常會這樣做,而Silverlight使用您定義的setter)。

請參閱「啓示自定義依賴屬性」 XAML Loading and Dependency Properties部分的詳細

+0

如果證實了這一點,我會接受Athari,但我也會爲你投票。你更快,但是我在閱讀Athari的評論後才明白這個問題。 – SmartK8

+0

非常感謝。 – SmartK8