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

irr*_*eal 6 xaml binding listview xamarin.forms

我有一个 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}">
Run Code Online (Sandbox Code Playgroud)

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*rke 1

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

例如

{ Binding SelectedDocument, Mode=TwoWay }
Run Code Online (Sandbox Code Playgroud)

只要 SelectedDocument 属性更改引发 INotifyPropertyChanged 事件,您就应该获得所需的效果。

  • SelectedItem 的默认绑定模式已经是双向的。唯一的问题是,当启动绑定时,列表视图的空选定项会覆盖视图模型填充的项。初始化后,绑定可以双向工作。单击列表中的 UI 会更改属性,并且从代码设置属性确实会更改列表视图,只需要一种方法让属性中的默认值在初始绑定时保持不变。它被覆盖为列表视图的默认“null” (5认同)