2009-12-28 67 views
0

我有一個問題。我做了一個DataTemplateTreeView,我需要設置ToggleButtonIsChecked財產根據我的模型的初始值。但事實證明,使用觸發器/設置器來設置此屬性會禁用數據綁定。數據綁定和觸發器兼容性在WPF

是這樣嗎?如果是,請給我一個建議如何解決?

<DataTemplate x:Key="CellTemplate_Name"> 
    <DockPanel x:Name="dock"> 
     <ToggleButton x:Name="Expander" 
     IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}"> <--- Binding 
    ... 
     <ToggleButton/> 
    ... 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=ObjIsOpened, Converter={StaticResource DebugConverter}}" Value="true"> <--- Trigger 
     <Setter TargetName="Expander" Property="IsChecked" Value="true"></Setter> 
     </DataTrigger> 
        ... 
    </DataTemplate.Triggers> 
</DataTemplate> 

問候,Lerax。

回答

2

首先,我建議你閱讀由約什 - 史密斯 Simplifying the WPF TreeView by Using the ViewModel Pattern

此基礎上文章很好的文章,我建議定義對於TreeViewItem(使用TreeViewItemContainerStyle屬性)風格結合其IsExpanded屬性模型對象的ObjIsOpened屬性。然後擺脫你的觸發器。

例子:

<Style TargetType="TreeViewItem"> 
    <Setter Property="IsExpanded" 
     Value="{Binding ObjIsOpened, Converter={StaticResource DebugConverter}}"/> 
</Style> 

<DataTemplate x:Key="CellTemplate_Name"> 
    <DockPanel x:Name="dock"> 
     <ToggleButton x:Name="Expander" 
     IsChecked="{Binding Path=IsExpanded, 
         RelativeSource={RelativeSource 
          AncestorType={x:Type TreeViewItem}}}"> <--- Binding 
    ... 
     <ToggleButton/> 
    ... 
</DataTemplate> 
+0

嗨Aviad。謝謝你的回答,它的效果非常好。但它不會修改我的模型中的ObjIsOpened值。所以,如果ObjIsOpened = true by defaul,則每個TreeViewItem在刷新後都會展開。我認爲MultiBinding可以提供幫助嗎?你怎麼看? – user101375

+0

什麼問題正是,在點擊切換按鈕不會改變ObjIsOpened,或在代碼改變ObjIsOpened不影響GUI?如果是前者,嘗試添加'模式= TwoWay'到綁定,如果是後者,你必須實現某種形式的變更通知在模型中,最常見的方式是落實'INotifyPropertyChanged'在你的類,每當ObjIsOpened設置,火那個事件。 –

+0

我的不好...「Mode = TwoWay」修復了這個問題。 – user101375

1

我懷疑他們不要禁用數據綁定,他們只是有更高的優先級。不用同時使用綁定和觸發器,爲什麼不使用其中的一個(綁定或觸發器)?例如。你可以綁定到直接模式,並在所有不使用觸發器...

+0

是,最好的解決辦法是derect結合的模式,但我已經綁定這個屬性到另一個。是否有可能將兩個以上的屬性綁定在一起?如果是的話,如何在XAML中完成?我剛剛發現了很多MultiBinding。 – user101375

+0

是的,有MultiBinding。但是,如果你可以從模型中設定價值,你爲什麼要使用它?模型知道當前狀態,正確(例如,對象剛創建,應該擴展。)? – Anvaka

+0

問題是我使用我自己的ToggleButton而不是TreeView的標準擴展器,它們必須綁定在一起。另外我需要爲它們設置初始值。因此,我需要綁定三個不同的屬性。這是對的嗎? – user101375