C# ListView中所选项目的粗体标签?

C# ListView中所选项目的粗体标签?,c#,xaml,data-binding,xamarin.forms,C#,Xaml,Data Binding,Xamarin.forms,我有以下XAML: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:StyleLabelInViewCell" x:Class="StyleLabe

我有以下XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:StyleLabelInViewCell" x:Class="StyleLabelInViewCell.MainPage">

    <ContentPage.Resources>
        <ResourceDictionary>
            <local:MainVM x:Key="MainVm" />
            <local:IsSelectedToStyle x:Key="IsSelectedToStyle" />
            <Style x:Key="SelectedStyle" TargetType="Label">
                <Setter Property="FontAttributes" Value="Bold" />
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout BindingContext="{StaticResource MainVm}">
        <ListView x:Name="ChildListView" VerticalOptions="Center" ItemsSource="{Binding Chidren}" SelectedItem="{Binding SelectedVm}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell x:Name="ChildViewCell">
                        <ViewCell.View>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>

                                <Button Text="&lt;" />

                                <Label 
                                    Grid.Column="1" 
                                    Text="{Binding Name}" 
                                    FontAttributes="{Binding Source={x:Reference ChildListView}, Path=SelectedItem.Id, Converter={StaticResource IsSelectedToStyle}, ConverterParameter={Binding Path=Id}}" 
                                />

                                <Button Grid.Column="2" Text="&gt;"  />
                            </Grid>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>
以及以下代码:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using Xamarin.Forms;

namespace StyleLabelInViewCell {
    public class MainVM : INotifyPropertyChanged {
        public MainVM() {
            Chidren = new ObservableCollection<ChildVM> {
                new ChildVM(1, "Item 1"),
                new ChildVM(2, "Item 2"),
                new ChildVM(3, "Item 3"),
                new ChildVM(4, "Item 4"),
                new ChildVM(5, "Item 5"),
                new ChildVM(6, "Item 6")
            };
        }

        public ObservableCollection<ChildVM> Chidren { get; }

        private ChildVM selectedVm;
        public ChildVM SelectedVm {
            get { return selectedVm; }
            set {
                if (!ReferenceEquals(selectedVm, value)) {
                    selectedVm = value;
                    OnPropertyChanged(nameof(SelectedVm));
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName) {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public class ChildVM {
        public ChildVM() { }

        public ChildVM(int id, string name) {
            Id = id;
            Name = name;
        }

        public int Id { get; }

        public string Name { get; }
    }

    public sealed class IsSelectedToStyle : IValueConverter {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
            var selectedId = (int)value;
            var currentItemId = (int)parameter; // This ends up being Xamarin.Forms.Binding instance

            return selectedId == currentItemId ? Application.Current.MainPage.Resources["SelectedStyle"] : null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
            throw new NotSupportedException();
        }
    }
}
当ItemTemplate呈现当前选定行时,我尝试加粗标签。问题是ConverterParameter是作为Xamarin.Forms.Binding实例发送的,而我本来希望是另一个整数


是否有某种方法来获取值而不是绑定,或者如果没有,从绑定获取值?还是有其他方法来完成我想做的事情?

我想你可以看看这个

我已经更新了。现在FontAttributes属性也有一个绑定

<ListView SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding List}">
    <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>
          <Label Text="{Binding Name}" FontAttributes="{Binding Selected, Converter={StaticResource cnvInvertFontAttribute}}}" TextColor="{Binding Selected, Converter={StaticResource cnvInvert}}}" FontSize="18"></Label>
        </ViewCell>
      </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
和IValueConverter将布尔选定属性转换为FontAttribute

public class SelectedToFontAttributeConverter : IValueConverter
{

    #region IValueConverter implementation

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            if ((Boolean)value)
                return FontAttributes.Bold;
            else
                return FontAttributes.None;
        }
        return FontAttributes.None;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

尝试使用ConverterParameter={Binding Path=.}。您可能会得到整个对象,但您可以从中提取Idthere@GeraldVersluis我做到了;我仍然只得到一个绑定实例。
public class SelectedToFontAttributeConverter : IValueConverter
{

    #region IValueConverter implementation

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool)
        {
            if ((Boolean)value)
                return FontAttributes.Bold;
            else
                return FontAttributes.None;
        }
        return FontAttributes.None;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}