2015-05-21 2 views
0

У меня есть listbox с listboxitems с image и textblock. В списке есть собственный класс в качестве источника данных. Что я хочу, так это когда listboxItem прослушивается. image внутри listboxitem изменяется.Обновление списка предметов, когда товар постучал

Вот то, что я до сих пор:

Мой пользовательский класс:

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) Bind 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

Установить <Высота сетки = "80" Вертикальное выравнивание = "Верх" Фон = "Прозрачный"> –

0

Если проблема не в пути к изображениям, я думаю, вам нужно реализовать интерфейс INotifyPropertyChanged, в классе MemberUser, а когда вы установите свойство 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 не натянуть. Проверьте, требуется ли для вашего URL ms-appx://// или нет. (он работает в приложениях Windows 8.1). Также вам нужно добавить расширение INotifyProperty Chaged, чтобы можно было мгновенно изменить свойство.

Смежные вопросы