gpt4 book ai didi

c# - ListView 被选中

转载 作者:太空狗 更新时间:2023-10-29 17:50:54 25 4
gpt4 key购买 nike

我在我的 xaml 中有一个 ListView ,我用这样的项目填充:

List<DataLayer.Models.Dictionary> dicts = DataLayer.Manager.getDictionaries();

if (dicts != null)
{
foreach (DataLayer.Models.Dictionary dict in dicts)
{
this.itemListView.Items.Add(dict);
}
}

我的 DataLayer.Models.Dictionary 对象有一个 isSelected 属性以及一个 Name 和一个 SubName

Name 和 SubName 在模板中工作正常,但我如何才能让项目被选中并在用户单击项目时更新?

谢谢!

编辑:

我的 xaml 现在看起来像这样,但该项目仍未选中

    <ListView
x:Name="itemListView"
TabIndex="1"
Grid.Row="1"
Margin="0,60,0,0"
Padding="0,0,0,0"
IsSwipeEnabled="False"
ScrollViewer.VerticalScrollBarVisibility="Hidden"
SelectionChanged="itemListView_SelectionChanged_1"
SelectionMode="Multiple"
FontFamily="Global User Interface">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding Source=Selected,Mode=TwoWay}"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="0,0,0,0">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding SubName}" Style="{StaticResource CaptionTextStyle}" TextWrapping="Wrap"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

最佳答案

[编辑]刚刚注意到这个问题实际上没有标记为 WPF;但我希望它仍然适用。

WPF 本质上是 MVVM。在代码隐藏中直接操作控件通常不是一个好主意。因此建议创建一个名为 ViewModel 的“ View 友好”模型; See Here .此外,为了使绑定(bind)有任何用处,在不断变化的环境中,您必须通知属性和/或集合的更改,以便可以更新控件。

首先,最重要的是你有一个字典集合,所以你创建这个集合以便它可以通知更改; ObservableCollection可以做到这一点。作为一般经验法则,WPF 使用的任何集合都应该只使用 ObservableCollection,和/或从中派生。

所以这里是竞争工作示例:

请记住,我正在使用 FODY注入(inject)我的 PropertyChanged raisers; See done manually

public class Dict : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

public string Name { get; set; }
public string SubName { get; set; }
public bool Selected { get; set; }
}

public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

public ObservableCollection<Dict> Dictionaries { get; set; }

public ViewModel()
{
Dictionaries = new ObservableCollection<Dict>()
{
new Dict()
{
Name = "English",
SubName = "en",
Selected = false,
},

new Dict()
{
Name = "English-British",
SubName = "en-uk",
Selected = true
},

new Dict()
{
Name = "French",
SubName = "fr",
Selected = true
}
};

Dictionaries.CollectionChanged += DictionariesCollectionChanged;
}

private void DictionariesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch(e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach(var dict in e.NewItems.Cast<Dict>())
dict.PropertyChanged += DictionaryChanged;
break;
case NotifyCollectionChangedAction.Remove:
foreach (var dict in e.OldItems.Cast<Dict>())
dict.PropertyChanged -= DictionaryChanged;
break;
}
}

private void DictionaryChanged(object sender, PropertyChangedEventArgs e)
{
Dict dictionary = (Dict)sender;

//handle a change in Dictionary
}
}

有了它,您可以随时添加或删除对象,尽管这里我只是在构造函数中初始化它们。

然后你会在你的窗口或控件中有这个。我包含了 namespace 以使其更加独立;但这适用于 WPF namespace 。

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">

<Window.Resources>
<local:ViewModel x:Key="viewmodel"/>
</Window.Resources>

<ListView
x:Name="itemListView"
DataContext="{StaticResource ResourceKey=viewmodel}"
ItemsSource="{Binding Path=Dictionaries}"
SelectionMode="Multiple">

<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding Path=Selected, Mode=TwoWay}"/>
</Style>
</ListView.ItemContainerStyle>

<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="0,0,0,0">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding SubName}" TextWrapping="Wrap"/>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Window>

如果您不为您的集合使用 ObservableCollection,那么在加载 WPF 之后开始向其中添加元素,它永远不会通知绑定(bind)管理器应该更新 ListView。

以上启动时:

On start, unfocused

你可以很容易地看到底层的字典集合正在被改变(即它不仅仅是 ListView),通过覆盖 selected 的返回值:

public bool Selected { get { return true; } set {/* do nothing*/ }}

这意味着所有内容始终处于选中状态,即使您尝试在 View 中取消选择也是如此。它总是看起来像这样:

Always seleted

样式是一个不同的问题,如果没有焦点,列表看起来会有所不同。 See Here

现在可以在代码隐藏中完成对选择更改的 react ,但这会将逻辑与 View 混合在一起。

[编辑] 已更新以包含检测任何 Dict 更改的能力(包括选定更改时)

You could look into this to simplify it

希望这对您有所帮助。

关于c# - ListView 被选中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com