2015-10-19 65 views
0

我有一個wpf格式的treeview,該格式最初可以正確綁定,但樹中某些checking and unchecking項的組合導致binding未能成功保存。wpf樹視圖中的複選框值不等於綁定屬性的值

這是屬性;

const string HAS_ACCESS = "HasAccess"; 

public bool? HasAccess 
{ 
    get 
     { 
     return hasAccess; 
     } 
    set 
     { 
     if (hasAccess == value) return; 
      if(!AllowUpdate(value)) return; 
       //Debug.WriteLine("{0} tried to set hasAccess to a value of {1} D = {2}, A = {3}, u = {4}, AllowChange = {5}, I = {6}", myPermission.Name, value, descendantChanged, ancestorChanged, userInstigatedChange, AllowUpdate(value), isInitialising); 
      ResetChangeBools(); 
      hasAccess = value; 
      Debug.WriteLine("HasAccess = {0}", HasAccess); 
      isInitialising = false; 
      RaisePropertyChanged(HAS_ACCESS); 
     } 
    } 

這是xaml;

<CheckBox Grid.Column="0" Grid.Row="1" 
      IsThreeState="true" 
      Content="{Binding MyPermission.Name}" 
      Click="CheckBox_Clicked" 
      IsChecked="{Binding HasAccess, Mode=OneWay}"/> 

我必須強調,將顯示HasAccess正確的值當treeviewinitialised而且更改大部分的時間做更新,但如果我檢查的treeview子項(即正確地檢查其父級), uncheck其父(正確地取消選中其子)然後重新檢查家長不再檢查的初始子元素。我包含Debug.writeline來檢查值是否正確設置,儘管我可以在Output窗口中看到正確的值,但它們不顯示在複選框中。任何幫助將不勝感激。

回答

0

我發現這個問題Med.Amine.Touil是幾乎沒有。該複選框有一個錯誤。當綁定模式設置爲OneWay時,它正在失去綁定,但我無法進行綁定TwoWay,因爲我不希望更改值直接更改基礎DataContext。通過使綁定TwoWay和UpdateSourceTrigger =顯式我得到了我想要的行爲。

IsChecked="{Binding HasAccess, Mode=TwoWay, UpdateSourceTrigger=Explicit} 
+0

好吧,非常酷:-) –

1

更改您的結合模式爲雙向Mode=TwoWay

+0

我試過這個,但它沒有奏效,問題是我的viewmodel的值沒有在控件中設置。 Oneway應該能夠展示這一點。 –

+0

@monkeyTrainer,你試過一個簡單的例子。我的意思是從setter中移除業務邏輯(只需做hasAccess = value並提升你的屬性改變的事件)並在你的虛擬機構造函數中使用這個HasAccess屬性來查看綁定是否正常 –