WP8突出显示SelectedItem LongListSelector

anf*_*fri 2 c# longlistselector windows-phone-8

我担心的是当用户点击它时,在我的LongListSelector中突出显示一个选定的项目.

我试过这个解决方案:http://code.msdn.microsoft.com/windowsapps/Highlight-a-selected-item-30ced444#content

但我还是有问题.
在我的项目中,LongListSelector填充了90~100个项目,如果我点击第x 元素,第(x + 20),第(x + 40),第(x + 60),(第x + 80)th ...也被突出显示.怎么可能?是什么导致这个?

我试着调试,我注意到"userControlList"(通过上面的链接看到MyLongListSelector1_SelectionChanged事件处理程序)在执行"GetItemsRecursive"后有20个元素,而不是90~100,因为我至少是预期的.

如果你无法解决这个问题,那么有谁知道如何在LongListSelector中实际突出显示所选项目?(使用Listbox而不是一个选项)

Chu*_*are 7

我们怎么样给你写一个更容易理解的更好的?另外,你可以有任何高亮颜色的组合?我将它用于我的一些应用程序.它所做的只是将背景颜色绑定到类.如果选中它,则返回类的高亮颜色,否则返回非高亮颜色.


样本数据点 - 如您所见,您可以设置高亮颜色和无高亮颜色

public class sample_data : INotifyPropertyChanged
{
    // Create the OnPropertyChanged method to raise the event
    public event PropertyChangedEventHandler PropertyChanged;         
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

    public sample_data(string name)
    {
        this.Name = name;
        this.IsSelected = false;
        this.NonHighlightColor = new SolidColorBrush(Colors.Transparent);
        this.HighLightColor = new SolidColorBrush(Colors.Red);
    }      

    public string Name { get; set; }

    private bool _is_selected;
    public bool IsSelected
    {
        get { return _is_selected; }
        set
        {
            _is_selected = value;
            OnPropertyChanged("HighlightBackgroundColor");
        }
    }

    public SolidColorBrush HighlightBackgroundColor
    {
        get { if (IsSelected) return HighLightColor; else return NonHighlightColor; }
    }

    private SolidColorBrush HighLightColor{ get; set; }

    private SolidColorBrush NonHighlightColor { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

让我们创建ObservableCollection并设置LongListSelector的ItemSource.

    private ObservableCollection<sample_data> CreateSampleData()
    {
        ObservableCollection<sample_data> sd = new ObservableCollection<sample_data>();

        sd.Add(new sample_data("Bob"));
        sd.Add(new sample_data("Dan"));
        sd.Add(new sample_data("Kate"));
        sd.Add(new sample_data("Bart"));
        sd.Add(new sample_data("Sanders"));
        sd.Add(new sample_data("Dog"));

        return sd;
    }

    // Constructor
    public MainPage()
    {
        InitializeComponent();

        mylonglist.ItemsSource = CreateSampleData();
    }
Run Code Online (Sandbox Code Playgroud)

现在为XAML

        <phone:LongListSelector x:Name="mylonglist" SelectionChanged="mylonglist_SelectionChanged">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <StackPanel Background="{Binding HighlightBackgroundColor}" Height="100">
                        <TextBlock Text="{Binding Name}"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
Run Code Online (Sandbox Code Playgroud)

选择变更代码

    private void mylonglist_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            LongListSelector ls = sender as LongListSelector;
            sample_data selected_item = ls.SelectedItem as sample_data;

            // unselected the previous selections
            foreach (sample_data sd in ls.ItemsSource)
            {
                if (sd != selected_item)
                {
                    sd.IsSelected = false;
                }
            }

            // set the selected item (this will cause the background color to change)
            selected_item.IsSelected = true;
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
    }
Run Code Online (Sandbox Code Playgroud)

你有它,现在你可以突出显示任何颜色和每个项目的自定义颜色,而不会弄乱凌乱的VisualState管理器.

在此输入图像描述