点击项目时更新列表框项目

update listbox item when item is tapped

我有一个 listbox 机智 listboxitems,一个 image 和一个 textblock。 列表框有一个自定义 class 作为数据源。 我想要的是 listboxItem 被点击时。 listboxitem 内的 image 发生变化。

这是我目前的情况:

我的习惯class:

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>

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

请帮忙!

如果问题不是图像路径,我认为您需要在 MemberUser class 中实现 INotifyPropertyChanged 接口,并在设置 Selected 属性 时通知更改所选图像 属性。类似于:

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));
        }
}

尝试

    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 扩展才能看到 属性 被立即更改。

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

1) 从 INotifyPropertyChanged

继承您的自定义 class
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();
    }
}