Xamarin:绑定:未在' Xamarin.Forms.ResourceDictionary'上找到的属性,目标属性

时间:2017-10-27 16:04:05

标签: c# xamarin logging binding xamarin.forms

我正在使用MVVM模式开发应用程序。绑定工作正常,但是当我在Android设备上调试我的应用程序时(我没有在iOS部分登录),我有以下日志:

绑定:' propertyName'未在' Xamarin.Forms.ResourceDictionary'上找到的属性,目标属性:' typeOfpropertyName'。

我不必在我的课程中实现INotifyPropertyChanged界面,因为它取决于我的需要。例如,我有一个带有DataTemplate的ListView(一个CustomViewCell)和一个ItemSource(用一个包含多个MyObject的List绑定):

CustomViewCell:

<ViewCell>
    <ViewCell.BindingContext>
        <ResourceDictionary>
            <local:Converter x:Key="converter"/>
        </ResourceDictionary>
    </ViewCell.BindingContext>
    <Grid>
        <Grid.Resources>
            <ResourceDictionary>
                <local:Converter x:Key="converter"/>
            </ResourceDictionary>
        </Grid.Resources>
        <Image
            Source="{Binding PictureImageSource}"/>
        <Image
            Source="{Binding User, Converter={StaticResource converter}}"/>
    </Grid>
</ViewCell>

MyObject.cs:

public ImageSource PictureImageSource
{
    get
    {
        return ImageSource.FromUri(new Uri(MyUrl));
    }
}

public User User
{
    get;
    set;
}

使用该代码我有以下日志:

绑定:&#39; PictureImageSource&#39;找不到&#39; Xamarin.Forms.ResourceDictionary&#39;,目标属性:&#39; Xamarin.Forms.Image.Source&#39;

绑定:&#39;用户&#39;未在&#39; Xamarin.Forms.ResourceDictionary&#39;上找到的属性,目标属性:&#39; Xamarin.Forms.Image.Source&#39;

我重复一切正常但我真的想删除这些日志。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我不知道我是否理解得很清楚,但如果我这样做,你只需要将资源字典更改为网格,例如。

见这个例子:

<ViewCell>
    <Grid>
        <Grid.Resources>                
            <ResourceDictionary>
                <local:Converter x:Key="converter"/>
            </ResourceDictionary>
        </Grid.Resources>
        <Image
            Source="{Binding PictureImageSource}"/>
        <Image
            Source="{Binding User, Converter={StaticResource converter}}"/>
    </Grid>
</ViewCell>

让我知道它是否适合你。

答案 1 :(得分:1)

这条线在这里做什么:

PUNCTUATION = '''!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~'''

WHITE_SPACE = ' \t\n\r\v\f'

EXTRANEOUS  = PUNCTUATION + WHITE_SPACE

str = ["HeLlo!!!,","H%I"]
l = []
for s in str:
    for x in EXTRANEOUS:
        sd = s.replace(x,"")
    l.append(sd)
print(l)

理想情况下,应该有一个包含<ViewCell.BindingContext> <ResourceDictionary> <local:Converter x:Key="converter"/> </ResourceDictionary> </ViewCell.BindingContext>

的ViewModel 应为页面设置

List<MyObject>BindingContext ItemSource应绑定到ListView,如下所示:

在ViewModel中:

List<MyObject>

然后在xaml文件中public List<MyObject> Objects {get; set;}

ListView

资源字典应该在元素级别,页面级别或应用程序级别。不在ViewCell的绑定上下文中。 ViewCell不应该有绑定上下文,因为它只是ListView的模板。

在你的情况下:

ItemsSource="{Binding Objects}" 

希望这有帮助。