Ras*_*yrk 9 c# xaml windows-8 winrt-xaml
我有一个listview,我xaml填充这样的项目:
List<DataLayer.Models.Dictionary> dicts = DataLayer.Manager.getDictionaries();
if (dicts != null)
{
foreach (DataLayer.Models.Dictionary dict in dicts)
{
this.itemListView.Items.Add(dict);
}
}
Run Code Online (Sandbox Code Playgroud)
我的DataLayer.Models.Dictionary对象有一个isSelected属性以及a Name和a 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>
Run Code Online (Sandbox Code Playgroud)
[编辑]刚刚注意到这个问题实际上并没有标记为WPF; 但我希望它仍然适用.
WPF本身就是MVVM.直接操作代码背后的控件通常不是一个好主意.因此建议创建一个名为ViewModel的"视图友好"模型; 看到这里.此外,对于任何用途的绑定,在更改的环境中,您必须通知对属性和/或集合的更改,以便可以更新控件.
首先,你有一个字典集合,所以你创建这个集合,以便它可以通知变化; ObservableCollection可以做到这一点.作为一般经验法则,WPF使用的任何集合都应该使用ObservableCollection,和/或从中派生.
所以这里是竞争工作的例子:
我记得我正在使用FODY注入我的PropertyChanged提升者; 看到手动完成
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
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,你可以随时添加或删除对象,虽然这里我只是在构造函数中初始化它们.
然后你会在你的窗口或控件中有这个.我已经包含了名称空间,使其更加独立; 但这将是WPF名称空间.
<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>
Run Code Online (Sandbox Code Playgroud)
如果你不使用的ObservableCollection为您收集,然后开始将元素添加到它后 WPF已加载机,它永远不会通知绑定管理的ListView中应该更新.
上面的启动:

通过覆盖选定的返回值,您可以轻松地看到基础Dictionaries集合正在被更改(即不仅仅是ListView):
public bool Selected { get { return true; } set {/* do nothing*/ }}
Run Code Online (Sandbox Code Playgroud)
这意味着即使您尝试在视图中取消选择,也始终选择所有内容.它总是这样:

样式是一个不同的问题,如果它没有焦点,列表看起来不同.看这里
现在对选择更改的反应可以在代码隐藏中完成,但这将是逻辑与视图的混合.
更新[编辑]以包括检测任何Dict中的更改的能力(包括选定的更改时)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
5216 次 |
| 最近记录: |