ListView无法在启动时突出显示所选项目

时间:2014-12-10 14:42:03

标签: c# wpf

我目前正在努力解决非常奇怪的问题而无法找到原因。 我有ListView

 <ListView ItemsSource="{Binding AvailableTestCaseDatas}" Grid.Row="2" Name="GListView" SelectedItem="{Binding SelectedTestCaseData, Mode=TwoWay}">
         <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
                </Style.Resources>
            </Style>
        </ListView.Resources>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding TestCaseName}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

但是当它加载时,我看不到选中的项目,即使我非常确定两个绑定都是正确的。此外,该项目似乎在内部选中,但未由ListView突出显示,因为当我单击所选项目时,ListView不会突出显示它。当我点击列表中的其他项目时 - 单击的项目会突出显示,然后我可以选择在开始时选择的项目。

即使我从XAML中删除SelectedItem并尝试在加载事件上执行listView.SelectedIndex = 0,也可以重现该问题。它仍然没有突出显示所选项目,即使它已被选中,我很确定:

  1. list.Items.Contains(List.selectedItem单选);
  2. list.Items.Count&gt; 0
  3. 当我这样做时:

    ctor {
    
            listView.Loaded += ListViewLoaded;
    }
    
        void ListViewLoaded(object sender, System.Windows.RoutedEventArgs e)
        {
            var item = listView.SelectedItem;
            listView.SelectedIndex = -1;
            listView.SelectedItem = item;
        }
    

    这看起来非常奇怪,它开始起作用了!

    我的约束力:

        public TestCaseData SelectedTestCaseData
        {
            get { return _selectedTestCaseData; }
            set
            {
                _selectedTestCaseData = value;
                OnPropertyChanged("SelectedTestCaseData");
            }
        }
    

    我试过了:

    1. 删除绑定,并使用代码检查问题。仍然转载。
    2. 确保此列表的代码中没有其他引用
    3. 启用列表(从一开始就禁用)
    4. 确保list.Items.Contains(list.SelectedItem)&amp;&amp; list.Items.Count&gt; 0
    5. 删除样式和数据模板。
    6. 如果我把这个Loaded事件放进去,它会起作用,但它是一个hack,我想至少有一个理由说明为什么它会像那样。有什么提示吗?

1 个答案:

答案 0 :(得分:0)

我用一些数据尝试了你的Xaml代码并且运行正常,所以问题在于你首先设置属性的方式。最可能的问题是SelectedItem在第一次被选中和未被选中,在那里发生了奇怪的事情。我建议您在设置所选项目(SelectedTestCaseData)时显示代码,并在设置数据上下文时以及加载集合数据时显示代码。在这里,我将展示我的代码,它可能会有所帮助:

相同的XAML,但我的变量:

        <ListView ItemsSource="{Binding Persons}" Grid.Row="2" Name="GListView" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}">
            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Style.Resources>
                        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
                    </Style.Resources>
                </Style>
            </ListView.Resources>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

模特:

public class PersonViewModel : ViewModelBase
{
    #region Name

    private string _Name;
    private const string NameName = "Name";

    public string Name
    {
        get { return _Name; }
        set
        {
            Set(NameName, ref _Name, value);
        }
    }

    #endregion
}

MainViewModel datacontext中的属性:

    #region Persons

    private ObservableCollection<PersonViewModel> _Persons;

    public ObservableCollection<PersonViewModel> Persons
    {
        get { return _Persons ?? (_Persons = GetAllPersons()); }
    }

    private ObservableCollection<PersonViewModel> GetAllPersons()
    {
        var toRet = new ObservableCollection<PersonViewModel>();

        foreach (var i in Enumerable.Range(1,10))
        {
            toRet.Add(new PersonViewModel {Name = string.Format("Person Name {0}", i)});
        }

        //!!!!!!!!!!!!!!!!!!!!!HERE I SET THE SELECTED ITEM
        SelectedPerson = toRet.First();

        return toRet;
    }


    #endregion

    #region SelectedPerson

    private PersonViewModel _SelectedPerson;
    private const string SelectedPersonName = "SelectedPerson";

    public PersonViewModel SelectedPerson
    {
        get { return _SelectedPerson; }
        set
        {
            Set(SelectedPersonName, ref _SelectedPerson, value);
        }
    }

    #endregion

设置数据上下文的方式

<Window x:Class="..."
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ...
    DataContext="{Binding Main, Source={StaticResource Locator}}">

在这种情况下,我使用Mvvm ligth的定位器来设置窗口的数据上下文。 希望这有助于解决这个问题......