绑定到ResourceDictionary中的Usercontrol

时间:2017-07-20 08:16:47

标签: c# xamarin.forms

尝试将用户输入绑定到通过ResourceDictionary实例化的对象时,我遇到了一个大问题。

<ContentPage.Resources>
    <ResourceDictionary>
        <model:BusinessObjectsGraphDatasource x:Key="Testdata" 
                                              Query="query {
                                                          test {
                                                            id
                                                            description
                                                            foo
                                                          }
                                                        }"

                                              Parameter="{Binding Source={x:Reference QueryParameterEntry}, Path=Text}"/>

    </ResourceDictionary>
</ContentPage.Resources>

<StackLayout HorizontalOptions="Center" VerticalOptions="Center" Orientation="Vertical">
    <Entry x:Name="QueryParameterEntry"/>

    <ListView ItemsSource="{Binding Source={x:StaticResource Testdata}, Path=Result}"/>

</StackLayout>

如您所见,我在ContentPage资源中定义了一个自定义Datasource(BusinessObjectsGraphDatasource)对象。但是这个数据源应该能够处理来自条目的数据绑定给出的参数。

BusinessObjectGraphDatasource是一个派生自BindableObject并发布一些BindableProperties(例如参数)的类

有人可以给我一个提示,如何处理这种情况?

此应用中的特殊情景说明: 我无法访问视图模型或代码隐藏文件。 我唯一能做的就是编写控件和资源,并在xaml中使用它们。

这里的问题是,我检索一个&#34;序列不包含匹配的元素&#34;异常,只要我将Binding添加到数据源。

堆栈跟踪看起来像这样:

       at System.Linq.Enumerable.First[TSource](IEnumerable`1 source, Func`2 predicate)
   at Xamarin.Forms.Xaml.ApplyPropertiesVisitor.TryAddToProperty(Object element, String localName, Object value, IXmlLineInfo lineInfo, XamlServiceProvider serviceProvider, Exception& exception)
   at Xamarin.Forms.Xaml.ApplyPropertiesVisitor.SetPropertyValue(Object xamlelement, XmlName propertyName, Object value, Object rootElement, INode node, HydratationContext context, IXmlLineInfo lineInfo)
   at Xamarin.Forms.Xaml.ApplyPropertiesVisitor.Visit(ElementNode node, INode parentNode)
   at Xamarin.Forms.Xaml.ElementNode.Accept(IXamlNodeVisitor visitor, INode parentNode)
   at Xamarin.Forms.Xaml.ElementNode.Accept(IXamlNodeVisitor visitor, INode parentNode)
   at Xamarin.Forms.Xaml.FillResourceDictionariesVisitor.Visit(ElementNode node, INode parentNode)
   at Xamarin.Forms.Xaml.ElementNode.Accept(IXamlNodeVisitor visitor, INode parentNode)
   at Xamarin.Forms.Xaml.ElementNode.Accept(IXamlNodeVisitor visitor, INode parentNode)
   at Xamarin.Forms.Xaml.RootNode.Accept(IXamlNodeVisitor visitor, INode parentNode)
   at Xamarin.Forms.Xaml.XamlLoader.Visit(RootNode rootnode, HydratationContext visitorContext)
   at Xamarin.Forms.Xaml.XamlLoader.Load(Object view, String xaml)
   at Xamarin.Forms.Xaml.XamlLoader.Load(Object view, Type callingType)
   at Xamarin.Forms.Xaml.Extensions.LoadFromXaml[TXaml](TXaml view, Type callingType)
   at App1.MainPage.InitializeComponent()
   at App1.MainPage..ctor()
   at App1.App..ctor()
   at App1.UWP.MainPage..ctor()
   at App1.UWP.App1_UWP_XamlTypeInfo.XamlTypeInfoProvider.Activate_4_MainPage()
   at App1.UWP.App1_UWP_XamlTypeInfo.XamlUserType.ActivateInstance()

可绑定属性的定义如下:

public BindableProperty ParameterProperty = BindableProperty.Create("Parameter", typeof(string),
            typeof(BusinessObjectsGraphDatasource), string.Empty, BindingMode.TwoWay, null, ParameterPropertyChanged);

        public string Parameter
        {
            get => (string)GetValue(ParameterProperty);
            set => SetValue(ParameterProperty, value);
        }

        private static void ParameterPropertyChanged(BindableObject bindable, object oldvalue, object newvalue)
        {
        }

欢呼声,

克里斯

1 个答案:

答案 0 :(得分:0)

您可能必须明确指出它应该是双向绑定:

Parameter="{Binding Source={x:Reference QueryParameterEntry}, Path=Text, BindingMode=TwoWay}"