2013-01-02 86 views
0

我正在使用Coverflow control in Windows 8 C# XAML App數據綁定CoverFlow控件的選定項目屬性?

我想將此控件的選定項屬性綁定到屬性,但沒有任何效果。以下是我使用的代碼讓我知道我在做什麼錯誤?

<controls:CoverFlow 
    Height="85" 
    Margin="0,40,0,0" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" 
    SpaceBetweenItems="35" 
    SelectedItem="{Binding DiarySelectedItem.DiarySmileyId}" 
    SpaceBetweenSelectedItemAndItems="40" 
    ItemClick="ItemView_ItemClick" 
    ItemTemplate="{StaticResource 50ItemTemplate}" 
    ItemsSource="{Binding DiarySmileyIdOC}" 
    SelectedItemChanged="CoverFlow_SelectedItemChanged" /> 
/// <summary> 
///  Sets and gets the DiarySelectedItem property. 
///  Changes to that property's value raise the PropertyChanged event. 
/// </summary> 
public DiaryItemDetail DiarySelectedItem 
{ 
    get { return _diarySelectedItem; } 

    set 
    { 
     if (_diarySelectedItem == value) 
     { 
      return; 
     } 

     _diarySelectedItem = value; 
     RaisePropertyChanged(DiarySelectedItemPropertyName); 
    } 
} 

/// <summary> 
///  Gets or sets the Diary Smiley Id Observable Collection. 
/// </summary> 
/// <value> 
///  The Diary Smiley Id Observable Collection. 
/// </value> 
public ObservableCollection<int> DiarySmileyIdOC 
{ 
    get { return _diarySmileyIdOC; } 

    set 
    { 
     if (_diarySmileyIdOC == value) 
     { 
      return; 
     } 

     _diarySmileyIdOC = value; 

     // Update bindings, no broadcast 
     RaisePropertyChanged(DiarySmileyIdOCPropertyName); 
    } 
} 

回答

0

既然你結合ObservableCollection<int>ItemsSourceSelectedItemint爲好。你已經考慮到了這一點,通過綁定到DiarySelectedItem.DiarySmileyId而不是直接到DiarySelecteditem

這有一個副作用,雖然你並沒有真正改變DiarySelectedItem但只是試圖改變其DiarySmileyId財產的價值。這可能不是你想要的有以下幾個原因:

  • 如果DiarySelectedItemnull,分配給DiarySelectedItem.DiarySmileyId時什麼都不會發生,因爲無聲NullReferenceException
  • 如果DiarySelectedItemnullDiaryItemDetail.DiarySmileyId有一個公共的setter,分配給DiarySelectedItem會改變,而其他屬性保持不變DiarySmileyId財產的實例的值。
  • 如果DiarySelectedItemnullDiaryItemDetail.DiarySmileyId沒有一個公共的setter,會發生什麼,因爲DiarySmileyId不能分配給。

你應該有一個單獨的屬性DiarySelectedItemId達到預期的行爲:

public DiaryItemDetail DiarySelectedItemId 
{ 
    get { return _diarySelectedItem.DiarySmileyId; } 

    set 
    { 
     if (_diarySelectedItem.DiarySmileyId == value) 
     { 
      return; 
     } 

     DiarySelectedItem = GetDairyItemDetail(value); // retrieve instance from repository 
     RaisePropertyChanged(DiarySelectedItemIdPropertyName); 
    } 
} 

public DiaryItemDetail DiarySelectedItem 
{ 
    get { return _diarySelectedItem; } 

    set 
    { 
     if (_diarySelectedItem == value) 
     { 
      return; 
     } 

     _diarySelectedItem = value; 
     RaisePropertyChanged(DiarySelectedItemPropertyName); 
     // notification to change the selected item in Coverflow if selected item is changed in code 
     RaisePropertyChanged(DiarySelectedItemIdPropertyName); 
    } 
} 

爲什麼你不設置ObservableCollection<DiaryItemDetail>ItemsSource,所以你可以直接綁定到SelectedItemSelectedItem

+0

謝謝達米爾。其實我想詳細說明這個情況。有選擇的字段被設置到此Coverflow控件中的列表視圖。但我不想從Coverflow控件設置回列表視圖。因此,我直接將列表視圖中選定的對象綁定到Coverflow控件。 –

+0

@BalrajSingh我不確定,我正在關注你。你說'DiarySelectedItem'是你的列表視圖中的選定項目,根據你選擇的項目在coverflow中,但你不希望它改變,當你在coverflow中選擇一個項目?您希望將哪個屬性設置爲coverflow中的選定項目? –

+0

其實這是添加/編輯窗體的項目以列表視圖的形式顯示。如果用戶選擇一個項目,它將顯示在編輯表單中,用戶可以通過單擊保存按鈕更改表單中的值,然後更改將保存並反映在列表視圖中。因此,我想將選定項目的值從列表視圖綁定到編輯表單,但是編輯表單值的更改不應直接反映在列表視圖上。當用戶點擊保存按鈕時,應該反映並保存。我想用屬性的綁定來實現這一點。我希望這可以幫助你理解。 –

相關問題