如何在集合视图中访问子元素?

时间:2019-06-21 10:38:15

标签: xamarin.forms xamarin.android xamarin.ios uicollectionview collectionview

我在收藏夹视图中制作相框,我想在每次选择相框时更改相框的背景颜色,但问题是我无法从收藏夹视图访问相框,而当我单击相框时,它将选择默认的相框橙色。

我在框架模型类中做了一些小的更改,在其中我想更改标签的文本颜色,就像我们在这里所做的那样,框架的颜色是代码,但无法正常工作  该代码在框架模型类中

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 :(得分:0)

CollectionView Spec:

  

橙色实际上是您的状态中state_activated的值   Android应用的主题。所以并不是每个人都会看到橙色。那只是   AppCompat默认。如果没有其他原因,这是后备值   指定。

     

在CollectionView中选择一个项目时,VisualState为   项目的根Forms元素更改为Selected。您可以使用   VisualStateManager来管理所选项目的外观。对于   一个例子,看看控件中的SelectionModeGallery   画廊。在该页面上,所选项目的背景色是   设置为LightSkyBlue。也可以设置任何其他Forms属性。   例如,尝试添加到   标签。

     

目前,这是有限的。你真的只能修改   您的ItemTemplate中的根元素。

因此,由于您的Frame不是ItemTemplate中的Root元素,因此无法回答您的问题。您可以在StackLAyout或SelectedItem中应用它,然后手动更改元素的背景颜色。

答案 1 :(得分:0)

  

当我将x:name属性提供给集合中的子视图时   查看我无法在我的C#类中访问它们

您无法从名称后面的代码访问模板中的项目,因为在运行时可能会创建0或1000个该模板的副本。

请参阅以下讨论:cannot-reach-control-x-name-inside-listview

在这种情况下,您可以将背景属性 binding 设置为模型中的属性,而不是访问模板中的控件,例如:

            <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;
        }
    }
}

项目资料:

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

我更新了示例here,您可以检查它。让我知道它是否对您有用!