2015-05-21 63 views
0

我有一個listbox機智listboxitemsimagetextblock。 列表框具有一個自定義類作爲數據源。 我想要的是什麼時候點擊listboxItemlistboxitem內部的image變化。當項目被挖掘時更新列表框項目

這是我到目前爲止有:

我的自定義類:

public class MemberUser 
    { 
     [JsonProperty("member_id", NullValueHandling = NullValueHandling.Ignore)] 
     public int member_id { get; private set; } 
     [JsonProperty("first_name", NullValueHandling = NullValueHandling.Ignore)] 
     public String first_name { get; private set; } 
     [JsonProperty("last_name", NullValueHandling = NullValueHandling.Ignore)] 
     public String last_name { get; private set; } 


     public string fullName 
     { 
      get 
      { 
       return String.Format("{0} {1}", first_name, last_name); 
      } 
     } 
     public bool selected{get;set;} 
     public string selectedImage 
     { 
      get{ 
       if (selected) 
       { 
        return "/Assets/ic_selected.png"; 
       } 
       else 
       { 
        return "/Assets/ic_not_selected.png"; 
       } 
      } 

     } 

    } 

我的代碼隱藏文件(只有你需要了解的代碼)

private OrganizationObject community; 
     private IEnumerable<MemberUser> memItems; 

     private List<MemberUser> notFoundEvents = new List<MemberUser>(); 

     public EventAdd() 
     { 
      InitializeComponent(); 
      BindData(); 
     } 
     private async void BindData() 
     { 
      try 
      { 
       memItems = MemberDataSource.memberList; 
       if (memItems.Count() == 0) 
       { 
        await MemberDataSource.GetLocalMember(); 
        memItems = MemberDataSource.memberList; 
       } 

       inviteList.DataContext = memItems; 
       /* foreach (MemberUser obj in memItems) 
       { 

        if (obj.accepted == 1) 
        { 
         inviteList.Items.Add(obj); 
        } 
       }*/ 
      } 
      catch (KeyNotFoundException) 
      { 
       NavigationService.GoBack(); 
      } 
     } 

private void Selectionchanged_Eventhandler_of_Listbox(object sender, SelectionChangedEventArgs e) 
     { 
      MemberUser myobject = (sender as ListBox).SelectedItem as MemberUser; 
      if (myobject.selected) 
      { 
       myobject.selected = false; 

      } 
      else 
      { 
       myobject.selected = true; 
      } 

     } 

我的XAML

<ListBox x:Name="inviteList" ItemsSource="{Binding}" Margin="20,0,0,0" SelectionChanged="Selectionchanged_Eventhandler_of_Listbox"> 
               <ListBox.ItemContainerStyle> 
                <Style TargetType="ListBoxItem"> 
                 <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
                </Style> 
               </ListBox.ItemContainerStyle> 
               <ListBox.ItemTemplate> 
                <DataTemplate> 
                 <Grid Height="80" VerticalAlignment="Top"> 
                  <Grid.ColumnDefinitions> 
                   <ColumnDefinition Width="auto" /> 
                   <ColumnDefinition Width="0.70*" /> 
                   <ColumnDefinition Width="auto" /> 
                  </Grid.ColumnDefinitions> 
                  <Image Grid.Column="0" Grid.Row="0" x:Name="img_selected" Source="{Binding selectedImage}" Width="26" Height="29"></Image> 
                  <TextBlock Grid.Column="1" Grid.Row="0" x:Name="fullName" Text="{Binding fullName}" Foreground="#FF4C6383" FontFamily="/Membr;component/Assets/Fonts/Fonts.zip#Source Sans Pro" Height="50" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0" /> 
                 </Grid> 
                </DataTemplate> 
               </ListBox.ItemTemplate> 
              </ListBox> 

那麼我錯過了什麼?另外,似乎我只能在每個列表項上點擊一次?

請幫忙!

回答

0

您可以用幾種方法實現它:

1)繼承您的自定義類從INotifyPropertyChanged的

public class MemberUser : INotifyPropertyChanged 
{ 
    public int member_id { get; private set; } 

    public String first_name { get; private set; } 

    public String last_name { get; private set; } 

    public string fullName 
    { 
     get 
     { 
      return String.Format("{0} {1}", first_name, last_name); 
     } 
    } 

    public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 
     set 
     { 
      _isSelected = value; 
      OnPropertyChanged("selectedImage"); 
     } 
    } 

    private bool _isSelected; 

    public string selectedImage 
    { 
     get 
     { 
      if (IsSelected) 
      { 
       return "/Assets/ic_selected.png"; 
      } 
      else 
      { 
       return "/Assets/ic_not_selected.png"; 
      } 
     } 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

2)綁定的ImageSource到IsSelected屬性通過轉換器

<Image Grid.Column="0" Grid.Row="0" x:Name="img_selected" Source="{Binding IsSelected, Converter={StaticResource SelectedImageConverter}}" Width="26" Height="29"></Image> 


public class SelectedImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     try 
     { 
      var isSelected = (bool)value; 
      return isSelected 
       ? "/Assets/ic_selected.png" 
       : "/Assets/ic_not_selected.png"; 
     } 
     catch (Exception) 
     { 
      return "/Assets/ic_not_selected.png"; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

首先解決方案做到了爲了我。但事件處理程序有時不會被調用。任何想法? – Steaphann

+0

你有沒有注意到任何規律? –

+0

Set

0

如果問題不是圖像路徑,我認爲您需要在MemberUser類中實現INotifyPropertyChanged接口,並且在設置Selected屬性時還通知SelectedImage屬性的更改。喜歡的東西:

private bool _selected; 
public bool Selected 
{ 
    get{ return _selected;} 
    set 
    { 
     if(value!=_selected) 
     { 
      _selected=value; 
      OnPropertyChanged("Selected"); 
      OnPropertyChanged("SelectedImage"); 
     } 
    } 
} 

private void OnPropertyChanged([CallerMemberName] string propertyName="") 
{ 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
} 
0

嘗試

public ImageSource selectedImage 
      { 
ImageSource temp; 
       get{ 
        if (selected) 
        { 
          temp=new BitmapImage(new Uri("ms-appx:////Assets/ic_selected.png", UriKind.RelativeOrAbsolute)); 
         return temp ; 
        } 
        else 
        { 
temp=new BitmapImage(new Uri("/Assets/ic_not_selected.png", UriKind.RelativeOrAbsolute)); 
         return temp ; 
        } 
       } 

      } 

由於圖片的來源綁定到一個ImageSource的不是字符串。 檢查您的網址是否需要ms-appx:////。 (它在Windows 8.1應用程序中)也需要添加一個INotifyProperty Chaged擴展,以便能夠立即查看正在更改的屬性。