【问题标题】:Listview Not binding through ViewModelListview 不通过 ViewModel 绑定
【发布时间】:2023-03-19 04:26:01
【问题描述】:

我在将ListViewViewModel 绑定时遇到问题。我创建了一个ViewModel 类的对象并将其设置为ListView 的BindingContext。该对象在初始化时包含 4 个项目,但 ListView 保持空白。我不确定我在这里缺少什么。我在下面添加了代码-

public class LeadershipViewModel
{
    private PfsServiceArea _oldProduct;
    public ObservableCollection Products { get; set; }
    public LeadershipViewModel()
    {
        Products = new ObservableCollection();
        var PFSArea = new PfsServices().GetPFSServiceArea("Leadership");
        if (PFSArea.Count > 0){
            foreach(PfsServiceArea pf in PFSArea){
            Products.Add(pf);
            }
        }
    }

    public void ShowOrHidePoducts(PfsServiceArea product)
    {
        if (_oldProduct == product)
        {
            // click twice on the same item will hide it
            product.ShowDescription = false;
            product.ShowDisplay = true;
            UpdateProducts(product);
        }
        else
        {
            if (_oldProduct != null)
            {
                // hide previous selected item
                product.ShowDescription = true;
                product.ShowDisplay = false;
                UpdateProducts(_oldProduct);
            }
            // show selected item
            product.ShowDescription = true;
            product.ShowDisplay = false;
            UpdateProducts(product);
        }

        _oldProduct = product;
    }

    private void UpdateProducts(PfsServiceArea product)
    {
        var index = Products.IndexOf(product);
        Products.Remove(product);
        Products.Insert(index, product);
    }

我已将其与ListView 绑定,如下所示 -

Private LeadershipViewModel leader = new LeadershipViewModel();
sicCodeList = new CustomListview(ListViewCachingStrategy.RetainElement)
{
    HorizontalOptions = LayoutOptions.StartAndExpand,
    VerticalOptions = LayoutOptions.EndAndExpand,
    ItemTemplate = sicDataTemplate,
    SeparatorVisibility = SeparatorVisibility.None,
    Margin = new Thickness(-5, 0, 0, 0),
    BindingContext = leader
};
sicCodeList.HasUnevenRows = true;
//sicCodeList.BindingContext = leader;
sicCodeList.SetBinding(ListView.ItemsSourceProperty, "Products");
sicCodeList.ItemTapped += (sender, e) => OnItemTapped(sender, e);

【问题讨论】:

    标签: c# listview xamarin xamarin.forms viewmodel


    【解决方案1】:

    最好将页面的 BindingContext 设置为您的 ViewModel。然后,您可以将列表绑定到列表视图的 ItemsSource:

    private LeadershipViewModel leader = new LeadershipViewModel();
    
    public MyPage()
    {
        InitializeComponent();
        BindingContext = leader;
        ListView sicCodeList = new ListView() { ... set properties ... };
        sicCodeList.SetBinding(ListView.ItemsSourceProperty, "Products");
    }
    

    【讨论】:

    • 非常感谢。真的很有帮助。
    【解决方案2】:

    我认为您忘记为您的 ListView 设置 ItemSource 属性

    sicCodeList.ItemSource = leader.Products;
    

    更多信息here

    【讨论】:

    • 谢谢我让它工作了。虽然现在还有一件事。 OnItemTapped 我无法获得 BindingContext,因此我无法在 ViewModel 下点击 ShowOrHidePoducts 方法。下面是 vm 始终为 NULL 的代码 - private void OnItemTapped(object sender, ItemTappedEventArgs e) { var product = e.Item as PfsServiceArea; var vm = BindingContext 作为 LeadershipViewModel; vm.ShowOrHidePoducts(产品); ((ListView)sender).SelectedItem = null; }
    • 为什么你不直接在你的onItemTapped方法中使用像leader.ShowOrHidePoducts(product);这样的vm实例调用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2012-09-17
    • 2010-11-23
    • 2021-10-20
    • 2018-05-10
    • 1970-01-01
    相关资源
    最近更新 更多