ListView里面的ListView + control.Visibility

Posted

技术标签:

【中文标题】ListView里面的ListView + control.Visibility【英文标题】:ListView inside ListView + control.Visibility 【发布时间】:2015-01-19 08:50:08 【问题描述】:

我正在创建一个问卷调查应用。我这样做的方法是创建一个包含问题文本的 ListView 和另一个包含答案列表的 ListView(作为 RadioButtons)。 当有一个问题的答案是“其他”时,问题就来了,需要一个文本框让用户输入一些文本。我怎样才能做到这一点?我的意思是我想让 TextBox 仅在答案集合包含内容为“其他”的 RadioButton 时才可见。 下面是我的 ListView 的 xaml 代码。

<ListView SelectionChanged="myList_SelectionChanged" ItemsSource="Binding OCquestions">
<ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="20 0 20 0">
                <TextBlock Text="Binding Path=questionText"/>
                    <ListView Name="ListaLista" SelectionChanged="myList_SelectionChanged" ItemsSource="Binding Path=listOfAnswer">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <RadioButton GroupName="Binding Path=questId" Content="Binding Path=answerText" Checked="RadioButton_Checked"/>                                       
                                </StackPanel>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>

// HERE I WANT A TEXTBOX WHICH IS VISIBLE ONLY WHEN listOfAnswer collection contain a RadioButton with Content "Others"

                </StackPanel>
            </DataTemplate>      
        </ListView.ItemTemplate>
    </ListView>

我不知道如何实现这一点。我对转换器不熟悉。谁能给我一些提示?

【问题讨论】:

【参考方案1】:

您需要一些触发器来显示/隐藏文本框,如下所示:

<DataTemplate>
   <StackPanel Orientation="Horizontal">
       <RadioButton GroupName="Binding Path=questId" 
                    Content="Binding Path=answerText" 
                    Checked="RadioButton_Checked" Name="radio"/>
       <TextBox Name="other" Visibility="Collapsed"/>
   </StackPanel>
   <DataTemplate.Triggers>
      <DataTrigger Binding="Binding answerText" Value="Other">
          <Setter TargetName="radio" Property="Content" Value=""/>
          <Setter TargetName="other" Property="Visibility" Value="Visible"/>
      </DataTrigger>
   </DataTemplate.Triggers>
</DataTemplate>

您可以看到DataTrigger 监听answerText,如果是"Other",只需将Radio 的内容设置为空字符串并将TextBox 的Visibility 设置为Visible 即可显示。此 TextBox 将显示在 RadioButton 的右侧。

【讨论】:

太好了,效果很好。我想我应该问另一个问题,但你可以帮助我。我想禁用/启用这个文本框,而你称为“收音机”的这个单选按钮是否被选中。你能帮我解决这个问题吗? 没关系,我想通了。再次非常感谢您。【参考方案2】:

首先添加一个ValueConverter

public abstract class BaseConverter : MarkupExtension

    public override object ProvideValue(IServiceProvider serviceProvider)
    
        return this;
    


public class AnswerCollectionToVisibilityConverter : BaseConverter, IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        ICollection<ListOfAnswers> answers = value as ICollection<ListOfAnswers>;
        if (answers != null)
        
            foreach (Answer answer in answers)
            
               if (OtherRadioButtonIsHere)
                   return Visibility.Visible;
        

        return Visibility.Collapsed;
    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
        return null;
    


然后添加一个TextBox,它使用ValueConverter来设置Visibility

<TextBox Visibility="Binding Path=listOfAnswer, Converter=AnswerCollectionToVisibilityConverter" />

【讨论】:

嗯,它看起来非常好,但我没有尝试过,因为第一个解决方案满足了我的需求,所以我首先标记为答案。谢谢你的回答。

以上是关于ListView里面的ListView + control.Visibility的主要内容,如果未能解决你的问题,请参考以下文章

在ListView里面flutter两个ListView.builder

C# 如何获取listview里面当前选中的item

ListView里面的ListView + control.Visibility

Flutter:ListView 里面的 ListView.builder

android listview 里面的item怎么让它居中?

Flutter- Gridview里面的listview问题