Как получить доступ к дочерним элементам в представлении коллекции? - PullRequest
0 голосов
/ 21 июня 2019

Я делаю фреймы в виде коллекции и хочу менять цвет фона фреймов всякий раз, когда выбираю фреймы, но проблема в том, что я не могу получить доступ к своим фреймам из вида коллекции, и когда я нажимаю на фрейм, он выбирает значение по умолчаниюоранжевый цвет.

я сделал небольшие изменения в классе модели фрейма, где я хочу изменить цвет текста моей метки так же, как мы сделали цвет фрейма, вот код, но он не работает, этот код находится во фреймекласс модели

public Color LabelColor
    {
        set
        {
            if (txtcolor != value)
            {
                txtcolor = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("labelcolor"));
                }
            }
        }
        get
        {
            return firstFrameBackColor;
        }
    }

здесь я получаю доступ к этому в моем классе CS

 FrameModel previous = (e.PreviousSelection.FirstOrDefault() as FrameModel);
        FrameModel current = (e.CurrentSelection.FirstOrDefault() as FrameModel);

        //Set the current to the color you want
        try
        {
            current.FirstFrameBackColor = Color.FromRgb(74, 152, 247);
            current.LabelColor = Color.White;
            // current.SecondFrameBackColor = Color.Green;
        }
        catch (Exception ex)
        {
            ex.Message.ToString();
            throw;
        }

       // current.SecondFrameBackColor = Color.Green;

        if (previous != null)
        {
            //Reset the previous to defaulr color
            previous.FirstFrameBackColor = Color.White;
            current.LabelColor = Color.Black;
            //previous.SecondFrameBackColor = Color.Purple;
        }

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

когда я передаю свойство x: name моим дочерним представлениям внутри коллекции посмотреть я не могу получить к ним доступ в моем классе C #

Вы не можете получить доступ к элементам в шаблонах из кода по имени, потому что во время выполнения может быть создано 0 или 1000 копий этого шаблона.

См. Это обсуждение: невозможен-контроль-х-имя-внутри-списка

В вашем случае вместо доступа к элементу управления в шаблоне вы можете установить свойство фона привязки к свойству в модели, например:

            <Frame
                        WidthRequest="20"
                        HeightRequest="20"   
                        Margin="0,-30,0,10"
                        HorizontalOptions="End"
                        CornerRadius="10"
                        Padding="5"
                        BackgroundColor="{Binding SecondFrameBackColor}">
                <Label
                            Text="5"
                            TextColor="#FFFFFF"
                            HorizontalTextAlignment="Center"
                            VerticalTextAlignment="Center"                                       
                    >

                </Label>
            </Frame>

Вот модель:

class myModel : INotifyPropertyChanged
{

    Color firstFrameBackColor;

    Color secondFrameBackColor;

    public event PropertyChangedEventHandler PropertyChanged;

    public myModel()
    {

    }

    public Color FirstFrameBackColor
    {
        set
        {
            if (firstFrameBackColor != value)
            {
                firstFrameBackColor = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("FirstFrameBackColor"));
                }
            }
        }
        get
        {
            return firstFrameBackColor;
        }
    }

    public Color SecondFrameBackColor
    {
        set
        {
            if (secondFrameBackColor != value)
            {
                secondFrameBackColor = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("SecondFrameBackColor"));
                }
            }
        }
        get
        {
            return secondFrameBackColor;
        }
    }
}

ItemSoure:

public partial class MainPage : ContentPage
{
    ObservableCollection<myModel> models = new ObservableCollection<myModel>();

    public MainPage()
    {
        InitializeComponent();

        myModel model1 = new myModel() { FirstFrameBackColor = Color.White, SecondFrameBackColor = Color.Purple };
        myModel model2 = new myModel() { FirstFrameBackColor = Color.White, SecondFrameBackColor = Color.Purple };
        myModel model3 = new myModel() { FirstFrameBackColor = Color.White, SecondFrameBackColor = Color.Purple };
        myModel model4 = new myModel() { FirstFrameBackColor = Color.White, SecondFrameBackColor = Color.Purple };
        myModel model5 = new myModel() { FirstFrameBackColor = Color.White, SecondFrameBackColor = Color.Purple };
        myModel model6 = new myModel() { FirstFrameBackColor = Color.White, SecondFrameBackColor = Color.Purple };
        myModel model7 = new myModel() { FirstFrameBackColor = Color.White, SecondFrameBackColor = Color.Purple };

        models.Add(model1);
        models.Add(model2);
        models.Add(model3);
        models.Add(model4);
        models.Add(model5);
        models.Add(model6);
        models.Add(model7);

        CNlist.ItemsSource = models;
    }

А в событии SelectionChanged измените фон на то, что вы хотите:

private void CNlist_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    myModel previous = (e.PreviousSelection.FirstOrDefault() as myModel) ;
    myModel current = (e.CurrentSelection.FirstOrDefault() as myModel);

    //Set the current to the color you want
    current.FirstFrameBackColor = Color.Pink;
    current.SecondFrameBackColor = Color.Green;

    if (previous != null)
    {
        //Reset the previous to defaulr color
        previous.FirstFrameBackColor = Color.White;
        previous.SecondFrameBackColor = Color.Purple;
    }

}

Вот результат:

screen

Я обновил свой образец здесь , и вы можете проверить его. Дайте мне знать, если это работает для вас!

0 голосов
/ 21 июня 2019

Из Спецификации CollectionView:

Оранжевый цвет на самом деле является значением для state_activation в теме вашего приложения для Android.Так что не все увидят апельсин;это просто AppCompat по умолчанию.Это запасное значение, если больше ничего не было указано.

Когда элемент в CollectionView выбран, VisualState для корневого элемента Forms элемента изменяется на Selected.Вы можете использовать VisualStateManager для управления тем, как выглядит выбранный элемент.Для примера, посмотрите на SelectionModeGallery в галерее управления.На этой странице цвет фона для выбранного элемента устанавливается на LightSkyBlue.Любое другое свойство Forms также может быть установлено;например, попробуйте добавить к тегу.

На данный момент это несколько ограничено;вы действительно можете изменить только корневой элемент в вашем ItemTemplate.

Поэтому, чтобы ответить на ваш вопрос, он не будет работать, так как ваш фрейм не является корневым элементом вашего ItemTemplate.Либо вы применяете это в вашем StackLAyout, либо в SelectedItem, вы вручную изменяете цвет фона вашего элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...