考虑以下伪代码。
视图模型:
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}}属性,有没有办法克服这个(最好是一个干净的...) ?
答案 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和丑陋代码的粉丝,但这是我找到的唯一方法。