- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在我的 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。
以上启动时:
你可以很容易地看到底层的字典集合正在被改变(即它不仅仅是 ListView),通过覆盖 selected 的返回值:
public bool Selected { get { return true; } set {/* do nothing*/ }}
这意味着所有内容始终处于选中状态,即使您尝试在 View 中取消选择也是如此。它总是看起来像这样:
样式是一个不同的问题,如果没有焦点,列表看起来会有所不同。 See Here
现在可以在代码隐藏中完成对选择更改的 react ,但这会将逻辑与 View 混合在一起。
[编辑] 已更新以包含检测任何 Dict 更改的能力(包括选定更改时)
You could look into this to simplify it
希望这对您有所帮助。
关于c# - ListView 被选中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714723/
谁知道现成的脚本或插件提供: -Shift click for check/uncheck all in range -CTRL click to select or unselect all 这可以
如果您点击按钮,它会打开 3 个复选框(一个选择全部,还有两个子输入)。 我想做的是,如果用户点击Centro de dia,输入将保持选中状态,而另一个(在本例中为button)会被选中未经检查。如
我正在学习 Wes Bos 30 天 Javascript 类(class),在一项可选功能上,我需要在底部添加三个按钮:清除全部、选中全部和取消选中全部。这是代码
自从升级到 jquery 1.9 以来,我的脚本停止了检查/取消选中复选框的工作。 我有一个主复选框,用于控制选择/检查表中的复选框列表。升级到新的 jquery 版本后,仅最初单击“检查全部”复选框
我有一个带有复选框列的表格,我添加了以下内容: 这是我的 jQuery 函数: jQuery(document).ready(function() { jQuery('#selec
这是我所拥有的(此处使用 Twitter bootstrap) #html fdsfdsfds
这个问题已经有答案了: Setting "checked" for a checkbox with jQuery (44 个回答) 已关闭 6 年前。 当我单击“问题”时,必须选择/取消选择两个复选框
我有这个表格: First Second Third --- Option1 Option2 有没有办法(使用 JS/jQuery)我可以在 First 时将 first
我试图有一个复选框来选中/取消选中所有其他复选框。 我正在使用此代码: $("#checkall").toggle( function () { $(".kselItems
在复选框列表中,应该可以通过按下按钮来选中/取消选中所有项目。但是下面的代码只能部分工作: All None
当我执行代码时,我得到 4 个复选框,我检查/选择了所有 4 个复选框,当我尝试调试代码时,它确实算作我有 4 个复选框,但所有 4 个复选框都被选中 = false。 我在代码中缺少什么? Li
$("input[type='radio']").each(function() { if ($(this).is(":checked")) { $(this).css('backgrou
我无法使用此 javascript 函数。任何帮助将不胜感激! No function yesno(thecheckbox, thelabel){ var ch
这是我的第一个 js 脚本,请对我温柔点:) 问题是当我点击选中所有按钮时,所有复选框都被选中但它不会将值写入文本区域,如果我单击单个复选框然后值被添加/删除并且没关系,我只是卡住了在那个选中所有/取
我试图在复选框处于选中状态或未选中状态时传递一个值。 但是,它似乎没有通过非检查状态。我正在使用的代码如下: if (document.getElementById('PRODUCT_REVIEW_E
目前我正在使用它来选中/取消选中表单中的所有复选框。 checked=false; function checkedAll (frm1) { var aa= document.getElem
我有 2 个单选按钮,当我单击其中一个按钮时,我会看到下拉菜单,必须在其中选择金额。 到目前为止,我能够检查/取消检查它们,但问题是,当我取消检查单选按钮下拉列表时,不会再次隐藏。 我不太擅长 Jav
HTML: Select All 1. 2. 3. 4. 5. JS: function test(click
我需要为每套图书设置一个选中/取消选中全部复选框。它还应该加上总价和重量。到目前为止,我只能选中每个框,它会很好地添加值,但是一旦我添加一个函数来选中所有框,一切都会停止工作。 //check all
我正在尝试根据来自 mysql 数据库的数据来选中或取消选中复选框。我使用nusoap webservice/webclient读取数据,数据值可以是1或0。 我的代码是: functio
我是一名优秀的程序员,十分优秀!