Listview “列表视图”;“隐藏”;子元素

Listview “列表视图”;“隐藏”;子元素,listview,xamarin.forms,scrollview,carousel,code-behind,Listview,Xamarin.forms,Scrollview,Carousel,Code Behind,大家好,新年快乐! 我一直在寻找答案。所以我的问题是为什么ListView、CarouselView和ScrollView元素“隐藏”了它的子元素?为了澄清测试,我放置了一个简单的网格,并添加了几个radiobutton(x:name=“radButton1”)和相应的标签(x:name=“label1”)(冗余但radiobutton当前不显示其文本值)和图像。从代码隐藏中,我可以使用radButton1.GroupName、label1.Text等访问它们。没有问题。但是,一旦我将它们移动到

大家好,新年快乐! 我一直在寻找答案。所以我的问题是为什么ListView、CarouselView和ScrollView元素“隐藏”了它的子元素?为了澄清测试,我放置了一个简单的网格,并添加了几个radiobutton(x:name=“radButton1”)和相应的标签(x:name=“label1”)(冗余但radiobutton当前不显示其文本值)和图像。从代码隐藏中,我可以使用radButton1.GroupName、label1.Text等访问它们。没有问题。但是,一旦我将它们移动到我的ListView、CarouselView、ScrollView中并返回到代码隐藏中,我就会发现radButton1、label1、image等错误。它们不再在当前上下文中,无法按名称值检索? 我试图获取listview元素,然后查看子元素,但这并没有显示这些元素,以便我可以修改它们,如文本值或可见等。在这一点上,我真正关心的是CarouseView,因为它使我能够更好地进行用户交互

好的,这是我的XAML代码和隐藏代码

<Image x:Name="greenCheck" Source="GreenCheckmark.gif" IsVisible="{Binding GreenCheck}"></Image> 
<Image x:Name="GrayCheck" Source="GrayCheckmark.gif" IsVisible="{Binding GrayCheck}"></Image> 
<Image x:Name="greenCheck1" Source="GreenCheckmark.gif" IsVisible="{Binding GreenCheck1}"></Image> 
<Image x:Name="GrayCheck1" Source="GrayCheckmark.gif" IsVisible="{Binding GrayCheck1}"></Image> 
Codebehind: 
GrayCheck = false; 
GreenCheck = true; 
GrayCheck1 = true; 
GreenCheck1 = false;

代码隐藏:
GrayCheck=false;
绿色支票=真;
GrayCheck1=真;
绿色支票1=假;
正在设置此选项,但在用户选择的任何选项上都不显示绿色复选框

蒂亚! 干杯
里克…

因为所有这些控件都是模板化的。不能按名称访问模板化元素

如果页面上有一个
标签
,并在XAML中为其指定一个
x:Name
myLabel,XAML编译器将创建一个名为myLabel的变量,可用于从代码后面引用该控件

但是,如果您的
列表视图
的模板中有
标签
,则运行时可能会生成0、12或1000份该
标签的副本,具体取决于
项目资源
中的项目数。您不能按名称引用它,因为它不是单个实例,而是0到多个实例

您应该使用数据绑定将UI的属性绑定到ViewModel,并在运行时更新ViewModel以更改UI。这是MVVM模式的一部分。您不应该在运行时直接修改模板控件的UI属性

但是,一旦我将它们移动到我的ListView、CarouselView、ScrollView中并返回到代码隐藏中,我就会发现radButton1、label1、image等错误。它们不再在当前上下文中,无法按名称值检索

正如Jason所说,您不能在ListView模板中按名称访问控件,您可以按viewmodel更改控件值

 <StackLayout>
        <ListView
            x:Name="listview"
            HasUnevenRows="True"
            ItemsSource="{Binding radiomodels}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>

                        <StackLayout>
                            <RadioButton
                                x:Name="radiobutton1"
                                GroupName="images"
                                Text="{Binding radiobutton1text}" />
                            <RadioButton
                                x:Name="radiobutton2"
                                GroupName="images"
                                Text="{Binding radiobutton2text}" />
                            <Switch x:Name="switch" IsToggled="{Binding ischeck, Mode=TwoWay}" />
                            <Image IsVisible="{Binding Path=IsToggled, Source={x:Reference switch}}" Source="{Binding image}" />
                            <Label Text="this is test" />
                            <Button
                                x:Name="btn1"
                                Clicked="btn1_Clicked"
                                Text="button" />
                        </StackLayout>

                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

        <Button
            x:Name="btnupdate"
            Clicked="btnupdate_Clicked"
            Text="update listview item" />
    </StackLayout>

 public partial class Page1 : ContentPage
{
    public ObservableCollection<radiomodel> radiomodels { get; set; }
    public Page1()
    {
        InitializeComponent();
        radiomodels = new ObservableCollection<radiomodel>()
        {
            new radiomodel(){radiobutton1text="radio button1",radiobutton2text="radio button2", ischeck=false,image="a5.jpg"},
            new radiomodel(){radiobutton1text="radio button1",radiobutton2text="radio button2",ischeck=false,image="a6.jpg"},
            new radiomodel(){radiobutton1text="radio button1",radiobutton2text="radio button2",ischeck=false,image="a7.jpg"},
            new radiomodel(){radiobutton1text="radio button1",radiobutton2text="radio button2",ischeck=false,image="a8.jpg"},
            new radiomodel(){radiobutton1text="radio button1",radiobutton2text="radio button2",ischeck=false,image="a9.jpg"}

        };
        this.BindingContext = this;
    }

   
    private void btnupdate_Clicked(object sender, EventArgs e)
    {
        radiomodel item = (radiomodel)listview.SelectedItem;
        var changeitem = radiomodels.FirstOrDefault(x => x.image == item.image);
        if(changeitem!=null)
        {
            changeitem.radiobutton1text = "test";
        }
    }
}

public class radiomodel:ViewModelBase
{
    private string _radiobutton1text;
    public string radiobutton1text
    {
        get { return _radiobutton1text; }
        set
        {
            _radiobutton1text = value;
            RaisePropertyChanged("radiobutton1text");
        }
    }

    private string _radiobutton2text;
    public string radiobutton2text
    {
        get { return _radiobutton2text; }
        set
        {
            _radiobutton2text = value;
            RaisePropertyChanged("radiobutton2text");
        }
    }
    private bool _ischeck;
    public bool ischeck
    {
        get { return _ischeck; }
        set
        {
            _ischeck = value;
            RaisePropertyChanged("ischeck");
        }
    }

    public string image { get; set; }
}
ViewModelBase是一个类,实现INotifyPropertyChanged接口,用于通知更新的数据

public class ViewModelBase : INotifyPropertyChanged
{
    
    public event PropertyChangedEventHandler PropertyChanged;

    
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

啊,好的,谢谢你,杰森。我在想类似的事情,但我想我最好问问。这是我真正需要做的事情,我使用了x:Name的绑定,使每个1都具有唯一的名称,这样我就可以控制特定的图像和/或标签,但只是不确定如何进行。这是一个非常简单的个人应用程序,所以我再次能够设置绑定数据,但再次不确定如何在代码中检索它们?你能给我举一个例子吗?也许我已经看到了一些,但他们所做的不是我真正需要的,但也许我确实需要,我只是没有遵循推理。你需要在你的模型中包含一个属性,以及你想为每一行显示的图像的路径或url。如果你想要一个更具体的例子,请更新你的问题描述您试图解决的一个特定问题,您可以理解,但在这种情况下,我如何使用它来控制图像的可见性?我特别需要做的是,根据用户从每个“页面”的2个按钮中选择的1个按钮,设置图像(复选标记)的可见性开/关。用户单击一个按钮,以便他们可以看到1个他们回答的问题,2个他们可以直观地看到他们选择的内容(例如,单击按钮1打开图像,单击按钮2确保图像1关闭,然后打开图像2,反之亦然)。如果您愿意,这是一个切换。每个旋转木马视图上具体有16个项目2,因此总共有8个旋转木马滑动。将您的images IsVisible属性绑定到模型中的bool,然后当用户更改其过滤器选择时,迭代您的项目资源并适当设置该属性谢谢Cherry的回复。我现在更多地了解这一点,并通过我的viewModel中的绑定进行控制,如上面编辑的对Jason的响应中所示。我简化了codebehind中的代码,该代码在单击按钮时被触发,在调试过程中被正确设置,但graycheck仍然可见,而greencheck仍然不可见。设置之后是否需要更多内容g由于imagebuttons而在codebehind中的值包含在旋转木马视图中?有32个检查图像(16个灰色,16个绿色)?@Rick如果GrayCheck和GreenCheck是属性,则此类实现INotifyPropertyChanged以通知数据更改?我建议您可以先看一看。
public class ViewModelBase : INotifyPropertyChanged
{
    
    public event PropertyChangedEventHandler PropertyChanged;

    
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}