簡體   English   中英

ListView在啟動時無法突出顯示所選項目

[英]ListView fails to highlight selected item on start

我目前正在為一個很奇怪的問題而苦苦掙扎,找不到原因。 我有一個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> 0

另外,當我這樣做時:

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)&& list.Items.Count> 0
  5. 刪除樣式和數據模板。

如果我放置了此Loaded事件,它會起作用,但它是一個hack,我至少希望知道為什么它具有這種行為。 有小費嗎?

我用一些數據嘗試了您的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數據上下文中的屬性:

    #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的Locator來設置窗口的數據上下文。 希望這有助於解決此問題...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM