【问题标题】:ListView inside ListView + control.VisibilityListView里面的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>

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

【问题讨论】:

    标签: wpf listview converter visibility


    【解决方案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}}" />
    

    【讨论】:

    • 嗯,它看起来非常好,但我没有尝试过,因为第一个解决方案满足了我的需求,所以我首先标记为答案。谢谢你的回答。
    猜你喜欢
    • 2019-08-10
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多