C# Xamarin使用可绑定属性形成ValueConverter

C# Xamarin使用可绑定属性形成ValueConverter,c#,xamarin,xamarin.forms,dependency-properties,ivalueconverter,C#,Xamarin,Xamarin.forms,Dependency Properties,Ivalueconverter,我有一个Xamarin项目,我正在尝试对我的ValueConverter进行绑定。 我在我的UWP项目中实现了这一点,但在Xamarin中我得到了一个编译错误: 找不到“UserData”的属性、可绑定属性或事件,或 值和属性之间的类型不匹配 这样做的目的是,当您在ListView中选择一个项目时,条目将读取UserValue属性,当您编辑此条目中的文本时,该项目属性的内容将更新,并且此更改在ListView中可见 这是我的代码: MainPage.XAML: <StackLayout&g

我有一个Xamarin项目,我正在尝试对我的ValueConverter进行绑定。 我在我的UWP项目中实现了这一点,但在Xamarin中我得到了一个编译错误:

找不到“UserData”的属性、可绑定属性或事件,或 值和属性之间的类型不匹配

这样做的目的是,当您在ListView中选择一个项目时,条目将读取UserValue属性,当您编辑此条目中的文本时,该项目属性的内容将更新,并且此更改在ListView中可见

这是我的代码:

MainPage.XAML:

<StackLayout>
    <Entry x:Name="Entry_NewValue" TextChanged="Entry_NewValue_TextChanged"/>

    <ListView x:Name="_ListView" ItemSelected="_ListView_ItemSelected">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Grid.Resources>
                            <local:ViewCell_Converter x:Key="ViewCell_Converter" UserData="{Binding}"/>
                        </Grid.Resources>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="2*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <Label Grid.Column="0" Text="{Binding UserName}"/>
                        <Label Grid.Column="1" Text="{Binding UserValue, Converter={StaticResource ViewCell_Converter}}"/>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>
public MainPage()
{
    InitializeComponent();

    _ListView.ItemsSource = UserDatas();
}        

private ObservableCollection<UserData> UserDatas()
{
    return new ObservableCollection<UserData>()
    {
        new UserData() { UserName = "Name1", UserValue = 10, ValidatedByUser = true, },
        new UserData() { UserName = "Name2", UserValue = 11, ValidatedByUser = false, },
        new UserData() { UserName = "Name3", UserValue = 12, ValidatedByUser = true, },
        new UserData() { UserName = "Name4", UserValue = 13, ValidatedByUser = false, },
        new UserData() { UserName = "Name5", UserValue = 14, ValidatedByUser = true, },
    };
}

private void _ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    if (e.SelectedItem is UserData userData)
    {
        Entry_NewValue.Text = userData.UserValue.ToString();
    }
}

private void Entry_NewValue_TextChanged(object sender, TextChangedEventArgs e)
{
    if (_ListView.SelectedItem is UserData userData)
    {
        if (double.TryParse(Entry_NewValue.Text, out double _double))
        {
            if(userData.UserValue != _double)
            {
                userData.UserValue = _double;
            }                
        }
    }
}
public class UserData : Prism.Mvvm.BindableBase
{
    private bool _validatedByUser;
    public bool ValidatedByUser
    {
        get
        {
            return _validatedByUser;
        }
        set
        {
            SetProperty(ref _validatedByUser, value);
        }
    }

    private string _userName;
    public string UserName
    {
        get
        {
            return _userName;
        }
        set
        {
            SetProperty(ref _userName, value);
        }
    }

    private double _userValue;
    public double UserValue
    {
        get
        {
            return _userValue;
        }
        set
        {
            SetProperty(ref _userValue, value);
        }
    }
    }

    public class ViewCell_Converter : BindableObject, IValueConverter
    {            
    public UserData UserData
    {
        get { return (UserData)GetValue(bindableProperty); }
        set { SetValue(bindableProperty, value); }
    }

    public static readonly BindableProperty bindableProperty = BindableProperty.Create(
                                                               nameof(UserData),
                                                               typeof(UserData),
                                                               typeof(ViewCell_Converter),
                                                               null);

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (UserData != null)
        {
            if (value is double _value)
            {
                if (UserData.ValidatedByUser)
                {
                    return string.Format("{0:0.00}", _value);
                }
                else
                {
                    return string.Format("{0:0.0000}", _value);
                }
            }
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
以下是资源(快速示例):

对于Valueconverter,您不需要更多

<StackLayout>
    <Entry x:Name="Entry_NewValue" TextChanged="Entry_NewValue_TextChanged"/>

    <ListView x:Name="_ListView" ItemSelected="_ListView_ItemSelected">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Grid.Resources>
                            <local:ViewCell_Converter x:Key="ViewCell_Converter"/>
                        </Grid.Resources>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="2*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <Label Grid.Column="0" Text="{Binding UserName}"/>
                        <Label Grid.Column="1" Text="{Binding UserValue, Converter={StaticResource ViewCell_Converter}}"/>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>


UserData在这里似乎是一个类,而不是一个可绑定属性,其中是您为ViewCell\u Converter创建的可绑定属性!!!谢谢你的回答,你能分享一些代码作为回答吗?我认为你出现这个错误的原因是因为你的viewcell类属性有以下名称:UserData,它与同一名称空间中的类的名称相同尝试稍微更改你的属性名并删除bin obj,然后尝试编译,但它不起作用,我得到了同样的编译错误,但是谢谢你的帮助。我可以问你为什么在网格资源中有这个类吗?
<StackLayout>
    <Entry x:Name="Entry_NewValue" TextChanged="Entry_NewValue_TextChanged"/>

    <ListView x:Name="_ListView" ItemSelected="_ListView_ItemSelected">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Grid.Resources>
                            <local:ViewCell_Converter x:Key="ViewCell_Converter"/>
                        </Grid.Resources>

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="2*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <Label Grid.Column="0" Text="{Binding UserName}"/>
                        <Label Grid.Column="1" Text="{Binding UserValue, Converter={StaticResource ViewCell_Converter}}"/>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>