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

时间:2015-05-21 12:53:22

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

我有listbox智慧listboxitemsimagetextblock。 列表框有一个自定义类作为数据源。 我想要的是点击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>

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

请帮忙!

3 个答案:

答案 0 :(得分: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));
        }
}

答案 1 :(得分:0)

尝试

ms-appx:////

由于图像源绑定到ImageSource而不是字符串。 检查您的网址是否需要Props(new Actor)。 (它在Windows 8.1应用程序中也是如此)您还需要添加一个INotifyProperty Chaged扩展,以便能够立即看到属性被更改。

答案 2 :(得分: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)通过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();
    }
}