IsSynchronizedWithCurrentItem属性和当前项目的更新
-
10-07-2019 - |
题
我必须管理一个对话型的视图,它允许物品的列表(如果必要)和选择的过滤视图模型。该代码工作正常,我是否设置IsSynchronizedWithCurrentItem到真实与否。我的理解是,这个属性是不是默认在ListView真实的,所以我想更好地了解这个属性。
下面是在视图的XAML结合设置(其作品一样好,而不同步属性设置):
<ListView
ItemsSource="{Binding Projects.View}"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding SelectedProject, Mode=TwoWay}"
>
视图模型项目实际上是由私人的ObservableCollection支持的CollectionViewSource。我想我glommed这个想法从约什 - 史密斯的一个示例项目,但老实说,我现在不记得。下面是涉及XAML绑定VM的相关部分:
private ObservableCollection<ProjectViewModel> _projectsInternal { get; set; }
public CollectionViewSource Projects { get; set; }
private void _populateProjectListings(IEnumerable<Project> openProjects) {
var listing = (from p in openProjects
orderby p.Code.ToString()
select new ProjectViewModel(p)).ToList();
foreach (var pvm in listing)
pvm.PropertyChanged += _onProjectViewModelPropertyChanged;
_projectsInternal = new ObservableCollection<ProjectViewModel>(listing);
Projects = new CollectionViewSource {Source = _projectsInternal};
}
/// <summary>Property that is updated via the binding to the view</summary>
public ProjectViewModel SelectedProject { get; set; }
的CollectionViewSource的Filter属性有一个处理程序,其在由所述绑定正确地拿起列表视图模型项返回各个谓词。这里要说的是代码的主旨(这是在相同ProjectSelctionViewModel):
/// <summary>Trigger filtering of the <see cref="Projects"/> listing.</summary>
public void Filter(bool applyFilter)
{
if (applyFilter)
Projects.Filter += _onFilter;
else
Projects.Filter -= _onFilter;
OnPropertyChanged<ProjectSelectionViewModel>(vm=>vm.Status);
}
private void _onFilter(object sender, FilterEventArgs e)
{
var project = e.Item as ProjectViewModel;
if (project == null) return;
if (!project.IsMatch_Description(DescriptionText)) e.Accepted = false;
if (!project.IsMatch_SequenceNumber(SequenceNumberText)) e.Accepted = false;
if (!project.IsMatch_Prefix(PrefixText)) e.Accepted = false;
if (!project.IsMatch_Midfix(MidfixText)) e.Accepted = false;
if (!project.IsAvailable) e.Accepted = false;
}
设置模式=双向是多余的,因为ListView的绑定的SelectedItem默认情况下是双向的,但我不介意被明确它(我可能会感到不同的看法,一旦我了解WPF更好)。
我的代码是什么使IsSynchronizedWithCurrentItem =真冗余?
我的直觉是,这是不错的代码,但我不喜欢它的作品似乎通过“魔术”,这意味着我会欢迎任何有建设性的反馈是工作!
干杯,结果 Berryl
解决方案
IsSynchronizedWithCurrentItem
同步的 CurrentItem
一>默认 CollectionView
结合的的采集与控制的SelectedItem
。
既然你从来不使用<=>的<=>,你似乎没有绑定到相同的收集两次设置有问题的属性没有明显的效果都没有。
的演示如何属性同步(用于XAML观众喜欢 Kaxaml 或XAMLPad):
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<x:Array x:Key="Items" Type="{x:Type sys:String}">
<sys:String>Apple</sys:String>
<sys:String>Orange</sys:String>
<sys:String>Pear</sys:String>
<sys:String>Lime</sys:String>
</x:Array>
</Page.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<StackPanel Background="Transparent">
<ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{StaticResource Items}" />
<ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{StaticResource Items}" />
<!-- This TextBlock binds to the CurrentItem of the Items via the "/" -->
<TextBlock Text="{Binding Source={StaticResource Items}, Path=/}"/>
</StackPanel>
</ScrollViewer>
</Page>