【问题标题】:ListView checkbox to visible or hide textbox in same rowListView 复选框可在同一行中显示或隐藏文本框
【发布时间】:2015-08-01 15:08:42
【问题描述】:

我有一个列表视图,其中一列有复选框,另一列有文本框,列表视图中有多行。 我想根据选中和未选中的复选框设置文本框的可见和隐藏属性。 它是一个使用 MVVM 模式和 PRISM 的 WPF 项目。 请帮忙,我卡住了。

<ListView Width="Auto" ItemsSource="{Binding Path=PayFeeDetails}">
  <ListView.View>
    <GridViewColumn Header="Description" Width="110" >
      <GridViewColumn.CellTemplate>
        <DataTemplate>
          <Grid>
             <Grid.ColumnDefinitions>
               <ColumnDefinition Width="80"/>
               <ColumnDefinition Width="auto"/>
             </Grid.ColumnDefinitions>
             <TextBlock Grid.Column="0" Text="{Binding Path=Description}"/>
             <CheckBox Grid.Column="1" Width="30" Name="CommentCheckBox"/>
          </Grid>
        </DataTemplate>
      </GridViewColumn.CellTemplate>
    </GridViewColumn>
    <GridViewColumn Width="140">
      <GridViewColumnHeader Tag="GameName" Content="Game Name" />
       <GridViewColumn.CellTemplate>
        <DataTemplate>
          <Grid>
             <TextBox Text="{Binding Path=Balance}"/>
             <TextBlock Text="{Binding Path=Balance}"/>
          </Grid>
        </DataTemplate>
      </GridViewColumn.CellTemplate>
    </GridViewColumn>
   </GridView>
  </ListView.View>
 </ListView>

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 为复选框命名并在文本框中绑定元素名称以及使用 BooleanToVisibilityConverter。但它没有工作。
  • 最简单的解决方案是将项目中的属性设置为复选框的状态,并使用布尔到可见性转换器将该属性绑定到文本框可见性。
  • 什么是PayFeeDetails
  • 'PayFeeDetails'是ViewModel中定义的属性,已经绑定在View中。

标签: c# wpf listview mvvm checkbox


【解决方案1】:

您需要将绑定添加到第二个 Gridview 网格的可见性。 现在在 Gridview1 itemclick 上创建一个 INotify 属性更改并从在第二个网格中设置为源的集合中更新该特定项目的 Grid Visibility。

【讨论】:

  • 我是 WPF 、MVVM 和 PRISM 的新手。在这个项目中,我使用的是 PRISM,因此定义的模型继承了 BindableBase,它具有内置的 INotify 属性。
  • 如果您使用的是 Prism,那很好,因为您不必担心 Inotify 属性。现在您需要添加一个可见性类型的新变量,这将可绑定到第二个 Gridview 的 Grid。最初填充时将其设置为 Visibility.Collapsed。现在,当在第一个 Gridview 中单击一个项目时,您需要将第二个 Gridview 的集合更新为 Visibility.Visible
【解决方案2】:

我会走这条路

1) 创建一个具有让我知道我可以编辑的属性的对象。

public class  ItemToBindTo:INotifyPropertyChanged
{
    #region Fields
    public event PropertyChangedEventHandler PropertyChanged;
    private bool _canEdit;
    private string _description;
    private string _balance;
    #endregion

    #region Properties
    public bool CanEdit
    {
        get
        {
            return _canEdit;
        }
        set
        {
            _canEdit = value;
               OnPropertyChanged("CanEdit");
        }
    }

    public string Description
    {
        get
        {
            return _description;
        }
        set
        {
            _description = value;
               OnPropertyChanged("Description");
        }
    }

    public string Balance
    {
        get
        {
            return _balance;
        }
        set
        {
            _balance = value;
               OnPropertyChanged("Balance");
        }
    }
    #endregion 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
} 

2) 我将为可见性创建转换器

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var val = value as bool? ;
        return val.HasValue && val.Value ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

public class InvertedBoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var val = value as bool?;
        return !(val.HasValue && val.Value) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我会将转换器作为静态资源

     <sigColor:InvertedBoolToVisibilityConverter x:Key="InvertedBoolToVisibilityConverter"/>
    <sigColor:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>

这将是你的新 xaml

<ListView Width="Auto" ItemsSource="{Binding Path=PayFeeDetails}">
        <ListView.View>
            <GridView>
            <GridViewColumn Header="Description" Width="110" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="80"/>
                                <ColumnDefinition Width="auto"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" Text="{Binding Path=Description}"/>
                            <CheckBox Grid.Column="1" Width="30" Name="CommentCheckBox" IsChecked="{Binding CanEdit, Mode=TwoWay}"/>
                        </Grid>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn >
                <GridViewColumnHeader Tag="GameName" Content="Game Name" />
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBox Text="{Binding Path=Balance}" Visibility="{Binding CanEdit, Converter={StaticResource BoolToVisibilityConverter}}"/>
                                <TextBlock Text="{Binding Path=Balance}" Visibility="{Binding CanEdit, Converter={StaticResource InvertedBoolToVisibilityConverter}}"/>
                    </Grid>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
            </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多