Xamarin.Forms:如何获取引用绑定的属性通知

时间:2017-03-23 04:12:53

标签: c# xaml mvvm data-binding xamarin.forms

考虑以下伪代码。

视图模型:

public class ViewModel
{
    IEnumerable<string> _AvailableNames
    public IEnumerable<string> AvailableNames
    {
        get => _AvailableNames;
        set => SetProperty(ref _AvailableNames, value); //Notifies
    }
}

查看:
ContentPage的ViewModel是依赖注入设置的ViewModel实例。

<ContentPage x:Name="page" prism:ViewModelLocator.AutowireViewModel="True">
    <Element BindingContext="{Binding SelectedElement}">
        <ListView ItemsSource="{Binding BindingContext.AvailabeNames, Source={Reference page}}" />
    </Element>
</ContentPage>

AvailableNames属性会根据需要进行更新,但不会反映在UI中。我怀疑是因为绑定属性是BindingContext.AvailableNames,是这样吗?我的意思是它绑定到AvailableNames属性,但在属性更改时不会更新。

注意,我尝试将AvailableNames设为仅限ObservableCollection,但为其添加值也不会反映到页面中。

我理解这是因为ItemsSource属性绑定到BindingContext的{​​{1}}属性,有没有办法克服这个(最好是一个干净的...) ?

1 个答案:

答案 0 :(得分:0)

对于我的场景,将BindingContext设置回上层属性(即ViewModel)就足够了,这在其他一些场景中也是一个限制,例如,如果我从内部绑定一个ListView等。

所以解决方法是将其设置如下:

<ListView
  BindingContext="{Binding BindingContext, Source={Reference usersPage}}"
  ItemsSource="{Binding AvailabeNames}"/>

在某些情况下,另一种选择是更好的解决方案,用如下的虚拟控件包装它:

<ContentView BindingContext="{Binding BindingContext, Source={Reference usersPage}}">
  <ListView ItemsSource="{Binding AvailableItems}"/>
</ContentView>

我不知道为什么,但是对于某些需要string以外的某些值的控件(即Switch),我似乎无法将此绑定到转换为价值没有更新。解决方法是使用虚拟控件获取值的字符串表示 在我的情况下,我使用MultiBinding类,即使它的转换器总是返回bool(否则将在内部抛出NullReferenceException并且不显示任何内容),仍然没有t正确更新自己。有了第三方财产,它运作良好:

<Label x:Name="dummyLabel" Text="{MultiBinding}"/>
<Switch IsToggled="{Binding Text, Source={Reference dummyLabel}}"/>

显然,我不是这个hacky和丑陋代码的粉丝,但这是我找到的唯一方法。