C# ListView复选框在同一行中可见或隐藏文本框
我有一个列表视图,其中一列有复选框,另一列有文本框,列表视图中有多行。 我想根据选中和未选中的复选框设置textbox的visible和hide属性。 它是一个使用MVVM模式和PRISM的WPF项目。 请帮帮我,我卡住了C# ListView复选框在同一行中可见或隐藏文本框,c#,wpf,listview,mvvm,checkbox,C#,Wpf,Listview,Mvvm,Checkbox,我有一个列表视图,其中一列有复选框,另一列有文本框,列表视图中有多行。 我想根据选中和未选中的复选框设置textbox的visible和hide属性。 它是一个使用MVVM模式和PRISM的WPF项目。 请帮帮我,我卡住了 <ListView Width="Auto" ItemsSource="{Binding Path=PayFeeDetails}"> <ListView.View> <GridViewColumn Header="Descriptio
<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>
您需要为第二个Gridview网格的可见性添加一个绑定。 现在,在Gridview1项上,单击“创建INotify属性更改”,并从第二个网格中设置为源的集合中更新该特定项的网格可见性。我会这样做 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>
到目前为止,您尝试了什么?为复选框命名,并在文本框中绑定元素名称,同时使用BooleantVisibilityConverter。但它不起作用。最简单的解决方案是将项目中绑定的属性设置为复选框的状态,并使用bool-to-visibility转换器将该属性绑定到文本框可见性。什么是PayFeedDetails
?“PayFeedDetails”是在视图模型中定义的属性,该属性已绑定到视图中。我对WPF、MVVM和PRISM不熟悉。在这个项目中,我使用的是PRISM,因此定义的模型继承了BindableBase,它具有inbuild INotify属性。如果您使用的是PRISM,那么这很好,因为您不必担心INotify属性。现在,您需要添加一个可见性类型的新变量,该变量将绑定到第二个Gridview的网格。初始填充时,将其设置为Visibility.Collapsed。现在,当在第一个Gridview中单击一个项目时,您需要将第二个Gridview的集合更新为Visibility.Visible