如何绑定可能为null的类的属性-设计不良的迹象

时间:2018-07-25 00:26:12

标签: c# xaml mvvm xamarin.forms prism

我遇到了这样一个场景:我在xaml视图中从我的viewmodel绑定到一个属性,其中VM属性可能为null。这会导致我的视​​图无法加载,因为我相信自己会收到NullReferenceException。

VM:

 public class PersonDetailViewModel : ViewModelBase
    {
        public Person CurrentPerson
        {
            get => currentPerson;
            set => SetProperty(ref currentPerson, value);
        }

        private Person currentPerson;

        public bool IsBobsFriendsVisible => FriendNamedBob?.Friends?.Count > 0;
        public Person FriendNamedBob => CurrentPerson?.Friends?.FirstOrDefault(x => x.Name == "Bob");

        public PersonDetailViewModel()
        {
            CurrentPerson = new Person()
            {
                Name = "Henry",
                Friends = new List<Person>() { new Person() { Name = "Rachel" } }
            };
        }
    }

XAML:

<ContentPage>
    <ContantPage.Content>
        <StackLayout>
            <Label Text="Bob's Friends Count:" IsVisible="{Binding IsBobsFriendsVisible}" />
            <Label Text="{Binding FriendNamedBob.Friends.Count}" IsVisible="{Binding IsBobsFriendsVisible}" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

由于FriendNamedBob为空,因此此行显然是导致问题的原因:

<Label Text="{Binding FriendNamedBob.Friends.Count}" IsVisible="{Binding IsBobsFriendsVisible}" />

处理这种情况的推荐技术是什么?这是不良设计的征兆吗?


更新: Xamarin.Lists https://github.com/xamarin/Xamarin.Forms/issues/1803似乎尚不支持FallBackValue的各种类型(包括TargetNullValue),而且在检查空https://bugzilla.xamarin.com/show_bug.cgi?id=57863

因此,这不是重复的(尚未)-在这种情况下,人们目前正在做什么?

1 个答案:

答案 0 :(得分:0)

在这里,让我解释一下如何处理Xaml中的Null绑定。而且我使用相同的格式将对象列表绑定到xaml中,并且有效。

Public Class Person
{
  Public Person()
  {
  }
      int id=0;--- Here we are doing default Initialization of object to handle default null values 
        public int ID
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
                OnPropertyChanged();
            }
        }

        string name="";--- Here we are doing default Initialization of object to handle default null values 
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                OnPropertyChanged();
            }
        }
}

现在我们可以直接在XAML中绑定