如何将ContentView绑定到属性?

时间:2018-02-28 19:48:01

标签: c# xamarin mvvm data-binding binding

我很难将ContentView绑定到C#Xamarin应用中的属性。

以下是我撰写的方式:

protected override View MyView
{
    get
    {
        if (_myView == null)
        {
            _myView = new ContentView
            {
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.StartAndExpand,
                Padding = new Thickness(0, 40),
                Content = new StackLayout(),
            };

            if (Vm.ItemCount > 0)
            {
                (_myView.Content as StackLayout).Children.Add(MyListview);
            }
            else
            {
                (_myView.Content as StackLayout).Children.Add(NothingExistsLabel);
            }
        }

        return _myView;
    }
}

现在Vm.ItemCount可以随时更改,但UI不会更新。

有没有办法可以将ContentView数据绑定到Vm.ItemCount,这样当ItemCount发生变化时,UI会自动更新?

感谢。

2 个答案:

答案 0 :(得分:1)

内容不是可绑定的属性。

您可以将方法连接到ItemCount设置器,以便在更新ItemCount时刷新UI。

答案 1 :(得分:0)

当您自己创建视图时,除非您通知发生更改,否则Xamarin引擎无法知道属性是否已更改。

你有2个解决方案:

  • 在您的视图上实现接口INotifyPropertyChanged,以便Xamarin可以绑定到您的事件“PropertyChanged”

  • (我最喜欢的)使用MVVM Helpers nuget https://github.com/jamesmontemagno/mvvm-helpers来简化实现。例如:

你的模特

public class MyViewModel : BaseViewModel // From MVVM Helpers nuget
{
    private IEnumerable<int> count;
    public IEnumerable<int> Count
    {
        get { return count; }
        set { SetProperty(ref count, value); }
    }
}

您的观点

public class MyView : ContentView
{
    private MyViewModel Vm { get; set; }

    public MyView()
    {
        this.Vm = new MyViewModel();
        this.BindingContext = this.Vm;
    }

    public void DoSomething()
    {
        this.Vm.Count = 42;
    }
}

在Xaml中添加绑定

<Label Text = "{Binding Count}" />