【问题标题】:Xamarin Forms ListView ItemTapped to object from ViewModelXamarin Forms ListView ItemTapped 到来自 ViewModel 的对象
【发布时间】:2020-03-18 13:36:24
【问题描述】:

我有问题。我从我的 ViewModel 创建了一个带有 ItemSource 的 ListView。现在,ItemSource 是一个 ObservableCollection<KnownDevice>,其中包含一些名为 KnownDevice 的对象。在我的 ListView 中,我设置了:ItemTapped="rowDevice_Clicked",具有以下功能:

private void rowDevice_Clicked(object sender, ItemTappedEventArgs e)
{
    ListView listView= (ListView)sender;
}

但现在我需要知道点击了哪个 KnownDevice。

我该怎么做?

【问题讨论】:

  • e.Item 包含被点击的项目

标签: c# xamarin xamarin.forms xamarin.android xamarin.ios


【解决方案1】:

在您的 rowDevice_Clicked

中添加这行代码
var device = e.Item as KnownDevice

【讨论】:

  • 谢谢,这就是我要找的 xD
【解决方案2】:

只需再创建一个 KnownDevice 实例

public ObservableCollection<KnownDevice> ThisIsMySelectionList {get; set;}
public KnownDevice ThisIsTheSelectedDeviceFromList {get; set;}

然后,在您的列表定义中

<ListView 
   ItemsSource="{Binding ThisIsMySelectionList}"
   SelectedItem="{Binding ThisIsTheSelectedDeviceFromList}" >

   .. rest of your column definitions to show

</ListView>

当一个项目从列表中被点击/选择时,它被绑定到“ThisIsTheSelectedDeviceFromList”的公共get/set,就像绑定到SelectedItem值一样

我相信还有其他人可以指向更直接的方式,但是在您的 getter/setter 中,您可以自己指向 app 对象,例如

public KnownDevice ThisIsTheSelectedDeviceFromList 
{
   get { return ((YourNamespace.App)App).YourKnownDeviceProperty; }
   set {((YourNamespace.App)App).YourKnownDeviceProperty = value; }
}

所以在这里,我通过限定您的项目 namespace.app 的静态应用程序对象,然后是您的属性来强制对您的应用程序进行类型转换。您可以根据需要直接获取和设置。

【讨论】:

  • 好的,但是如果我想将它绑定到例如App.selectedDevice 类型为KnownDevice 怎么办?
  • @A.Vreeswijk,查看修改后的答案以指向绑定的其他对象。
  • 当我点击一行时,代码没有在下一行遇到我的断点:set {((YourNamespace.App)App).YourKnownDeviceProperty = value; },所以 SelectedDevice 保持null。我做错了什么?
  • @A.Vreeswijk,可能是您的绑定上下文。如果表单/屏幕/页面/任何其他组件都没有连接到您的 MVVM(视图模型)的 BindingContext,它将无法工作......您没有提供足够的其余绑定/数据上下文。
  • 添加您的视图模型和 App.selectedDevice 您在此处参考您的问题@A.Vreeswijk。
【解决方案3】:

您需要创建一个属性 selectedDevice 并将其绑定到 listview 的 SelectedItem,下面是我的代码,希望对您有所帮助。

列表视图 XAML:

<ListView HasUnevenRows="True" 
          ItemsSource="{Binding KnownDeviceItems}" 
          SelectedItem="{Binding SelectedKnownDevice}"
          SeparatorVisibility="None">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    //code here for cell
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

ViewModel 属性:

private ObservableCollection<KnownDevice> knownDeviceItems;
    public ObservableCollection<KnownDevice> KnownDeviceItems
    {
        get { return knownDeviceItems; }
        set
        {
            knownDeviceItems = value;
            OnPropertyChanged();
        }
    }

    private KnownDevice selectedKnownDevice;
    public KnownDevice SelectedKnownDevice
    {
        get { return selectedKnownDevice; }
        set
        {
            selectedKnownDevice = value;
            OnPropertyChanged();
        }
    }

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多