2011-07-18 75 views
1

的longlistselector控制似乎正是我需要爲我的申請,我有一個很長的名單,我需要顯示和我喜歡的分組功能,它實現,但我真的很努力與數據綁定方面的工作。基本的數據綁定工作需要一段時間才能完成,但我已經具備了完整的功能。如果某個項目被刪除或添加,UI更新會正確,因爲數據源是從ObservableCollection派生的。WP7 LonglistSelector綁定 - 如何觸發更新到綁定項的結合

,我遇到的問題是,我在個人dataitems,我結合,表明如果一個人的列表項應顯示或隱藏的圖形標誌。這個想法是,當用戶在一個項目上執行一個保持手勢時,它會根據對綁定項目屬性的更改來打開或關閉圖形。

Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}} 

爲獲得該組頭和這種要求就像ObservableCollection<ObservableCollection<MyItem>>數據源的數據綁定LongListSelector要求(這是混亂只是爲了看看!)。實質上,外部集合是組,而內部集合包含顯示的項目。我的項目甚至實現了INotifyPropertyChanged接口。我期望的是我的項目屬性的更新會自動反映在我的數據綁定中,而不僅僅是添加或刪除集合中的項目。

如果我切換屬性值沒有任何反應,直到我手動刷新這需要完全重新加載綁定。該控件可能無法響應單個項目的屬性changed事件。

我需要的是幫助,搞清楚什麼我可以做,以觸發單個列表項的更新,我已經改變了綁定對象的一個​​屬性之後?

更新:

克勞斯,您創建是非常有益的(對不起,我沒有足夠的代表處,以投你了呢!)使用代碼我能顯著簡化我的代碼的代碼,並做更多的測試,但它仍然不能解決我的問題。

我現在已經確定的是,我的結合是罰款。如果我更改屬性時綁定到一個文本字段text="{Binding IsFavorite}"完美無瑕地更新。什麼似乎沒有工作是當我更新綁定到IValueConverter Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}"它不更新時更新相同的屬性。轉換器在初始綁定時工作正常,但不是屬性更改。爲了進一步進行測試,我將相同的bool屬性綁定到文本字段和IValueConverter。當我更改布爾值時,文本字段會更新,但不會使用轉換器進行字段綁定。

public class VisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Chemical chem = value as Chemical; 

     if (chem == null) 
      return Visibility.Collapsed; 

     if (chem.IsFavorite) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

XAML:

<myNS:ChemicalToFavoriteVisibilityConverter x:Key="isFavoriteToVisibility" /> 

<Rectangle Grid.Column="0" 
      Fill="{StaticResource PhoneContrastBackgroundBrush}" 
      Height="26" Stroke="Black" Width="26" 
      Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}"> 
    <Rectangle.OpacityMask> 
     <ImageBrush ImageSource="/Images/star_big.png"/> 
    </Rectangle.OpacityMask> 
</Rectangle> 
<StackPanel Grid.Column="1" Margin="0,0,0,0"> 
    <TextBlock Text="{Binding IsFavorite}" 
       TextWrapping="Wrap" 
       Style="{StaticResource PhoneTextLargeStyle}" 
       Foreground="{StaticResource PhoneForegroundBrush}"/> 
</StackPanel> 
+0

在問候了LongListSelector的數據綁定,你可以使用像https://gist.github.com/1089190 –

+0

這樣的簡化它看起來不像是實現將是可觀察的。你可以發佈一個代碼示例來用一個簡單的分組列表來填充這個類嗎?看起來也許我會通過某種lambda或類似的。 – CactusPCJack

+0

您可以使其實現ObservableCollection 而不是列表。實現類似於:GroupedUsers = new LongListCollection (users,u => u.Name [0]); –

回答

2

我解決了這個問題。問題是我將整個對象傳遞給IValueConverter,而不是在對象內改變的特定屬性。我改變了轉換器來專門處理布爾轉換爲可見性和固定的綁定:
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}}"

到:

public class BoolToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool boolValue = (bool)value; 

     return boolValue ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

的結合從改變
Visibility="{Binding Converter={StaticResource isFavoriteToVisibility}, Path=IsFavorite}"

+0

嘿CactusPCJack,你有沒有嘗試改變ItemTemplate TextBlock的ForeGround?我正在嘗試這樣做,但綁定失敗... – Depechie

0

您可以驗證在你不使用一次性的結合模式(而不是單向)綁定?我懷疑這個問題不會與LongListSelector,但你的綁定或你的INotifyPropertyChanged ...你可以發佈一些代碼(理想的是綁定,也是綁定的對象)。

+0

是的,我可以確認它不是一次性的。這是單向。從集合中刪除的項目消失,添加的項目顯示出來,但對屬性的更改似乎不會更新其綁定。 – CactusPCJack

+0

我試圖儘可能簡化項目,分享它,但在這裏發佈似乎不太合適。我會盡快發佈亮點。 – CactusPCJack

+0

查看我對問題的更新。看起來最初的列表人口工作正常,但是當綁定到IValueConverter時,有些東西阻止它看到字段的更新。 – CactusPCJack