绑定到 ListView 的 SelectedItem 属性时设置初始选定项

Posted

技术标签:

【中文标题】绑定到 ListView 的 SelectedItem 属性时设置初始选定项【英文标题】:Setting the initial selected item when binding to a ListView's SelectedItem property 【发布时间】:2015-12-06 08:36:34 【问题描述】:

我有一个 Xamarin.Forms xaml 页面,我在其中使用 ListView 来允许用户从列表中选择一个项目。我已将 ListView 的 SelectedItem 属性绑定到我的 ViewModel 上的一个属性,这工作正常。一旦用户更改所选项目,我的视图模型中的属性也会更新。

但是,即使我最初将 ViewModel 中的属性设置为列表中的值之一,当页面加载时 ListView 的 SelectedItem 属性为 null,这反过来也将 ViewModel 属性设置为 null。 我需要的是另一个方向,我希望 ListView 最初选择我在 VM 属性中设置的项目。

我可以通过在代码隐藏文件中编写额外的代码来显式设置初始选定项来组合一个解决方案,但这会引入额外的属性和复杂性并且非常难看。

设置ListView的初始选定项的正确方法是什么?谁的选定项绑定到视图模型属性?

-编辑-

我被要求提供用于绑定的代码。 非常简单,标准:

<ListView x:Name="myList" ItemsSource="Binding Documents" SelectedItem="Binding SelectedDocument">

设置为列表视图的绑定上下文的视图模型在创建页面之前被实例化,如下所示:

public class DocumentSelectViewModel : ViewModelBase

    private Document selectedDocument;

    public List<Document> Documents
    
        get  return CachedData.DocumentList; 
    

    public Document SelectedDocument
    
        get  return selectedDocument; 
        set  SetProperty(ref selectedDocument, value); 
    

    public DocumentSelectViewModel()
    
        SelectedDocuement = CachedData.DocumentList.FirstOrDefault();
    

SetProperty 是一个函数,如果新值与旧的经典绑定代码不同,它会简单地引发 INotifyPropertyChanged 事件。

【问题讨论】:

您需要发布用于绑定的代码。 我发布了代码。正如我所提到的,它只是一个简单的数据绑定,没有什么特别之处。这就是为什么我最初没有给出任何代码的原因。我只想知道如何设置双向绑定的默认值。现在,默认值始终是控件的默认值,我需要反过来,保持视图模型属性默认并将其应用于控件... 【参考方案1】:

我对 XAML 有点生疏,但您不需要进行双向绑定吗?

例如

 Binding SelectedDocument, Mode=TwoWay 

只要 SelectedDocument 属性更改引发 INotifyPropertyChanged 事件,那么您应该会得到想要的效果。

【讨论】:

SelectedItem 的默认绑定模式已经是双向的。唯一的麻烦是当绑定启动时,listview 的空选定项会覆盖 viewmodels 填充项。初始化后,绑定双向工作。单击列表中的 UI 会更改属性,从代码中设置属性确实会更改列表视图,只需要一种方法让属性中的默认值在初始绑定时保持不变。它被覆盖为列表视图的默认“null”【参考方案2】:

如果你替换

public DocumentSelectViewModel()

    SelectedDocument = CachedData.DocumentList.FirstOrDefault();

public DocumentSelectViewModel()

    SelectedDocument = Documents.FirstOrDefault();

它对你有用吗? 我有一个类似的问题已经通过这种方式解决了......

【讨论】:

【参考方案3】:

您可以使用 ctor DocumentSelectViewModel 设置初始值。 老实说,我不喜欢在 ctor 块中做一些工作,但是 Xamarin.... 你不需要 DocumentSelectViewModel 方法。它会起作用的。

public DocumentSelectViewModel ()
 
   SelectedDocument = Documents[0]; //or any your desired.

【讨论】:

以上是关于绑定到 ListView 的 SelectedItem 属性时设置初始选定项的主要内容,如果未能解决你的问题,请参考以下文章

字典到 ListView 双向绑定 - 可能吗?

将 ListView 的 SelectedItems 绑定到 ViewModel

绑定到 ListView 的 SelectedItem 属性时设置初始选定项

MVVM 绑定 ObservableCollection 到 Listview 不工作

c#wpf将列表绑定到Listview - listview行为空[关闭]

c#将list集合直接绑定到listview控件