【问题标题】:update listbox item when item is tapped点击项目时更新列表框项目
【发布时间】:2015-05-21 12:53:22
【问题描述】:

我有一个listbox 和一个listboxitems 和一个image 和一个textblock。 列表框有一个自定义类作为数据源。 我想要的是当listboxItem 被点击时。 listboxitem 中的 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>

那么我错过了什么?此外,似乎我只能在每个列表项上点击一次?

请帮忙!

【问题讨论】:

    标签: c# wpf xaml windows-phone-8 listbox


    【解决方案1】:

    您可以通过以下几种方式实现它:

    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) 通过Converter将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();
        }
    }
    

    【讨论】:

    • 第一个解决方案为我做了。但是有时不会调用事件处理程序。有什么想法吗?
    • 你有没有注意到任何规律性?
    • 设置
    【解决方案2】:

    如果问题不是图像路径,我认为您需要在 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));
            }
    }
    

    【讨论】:

      【解决方案3】:

      试试

          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 扩展,以便能够立即看到正在更改的属性。

      【讨论】:

        猜你喜欢
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多