我们想在ListView中添加CheckBox数据,并且需要添加序号。
效果
最后效果如图:
XAML里的代码
首先xaml里面我们添加
<ListView x:Name="lvRules" Grid.Column="1" AlternationCount="1000000" SelectionChanged="lbRules_SelectionChanged" MouseDown="lbRules_MouseDown" MouseDoubleClick="lbRules_MouseDoubleClick" >
<ListView.Resources>
<local:IndexConverter x:Key="IndexConverterNum" AddValue="1"/>
</ListView.Resources>
<ListView.View>
<GridView x:Name="lvRuleListView" >
<GridViewColumn Header="执行顺序" Width="80" >
<GridViewColumn.CellTemplate >
<DataTemplate>
<CheckBox IsChecked="{Binding isEnable}">
<TextBlock Text="{Binding (ItemsControl.AlternationIndex) ,
RelativeSource={RelativeSource AncestorType=ListViewItem},Converter={StaticResource IndexConverterNum}}" />
</CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="gvcRuleName" Header="规则名称" DisplayMemberBinding="{Binding ruleName}" />
<GridViewColumn x:Name="gvcDesc" Header="规则描述" DisplayMemberBinding="{Binding ruleDesc}" />
</GridView>
</ListView.View>
</ListView>
我们需要添加DataTemplate在GridViewColumn 中,并且绑定数据列表listRuleDatas
我的数据结构是这样的
脚本代码
public class RuleInfoData
{
public bool isEnable { get; set; }
public string ruleName { get; set; }
public string ruleDesc { get; set; }
}
在脚本中我们的业务逻辑里添加和绑定数据
listRuleDatas = new List<RuleInfoData>();
listRuleDatas.Add(new RuleInfoData { isEnable = true, ruleName = nowInfo.ruleName , ruleDesc = showtxt });
lvRules.ItemsSource = listRuleDatas;
刷新数据可以用
lvRules.Items.Refresh();
关于序号
序号我们可以设置AlternationCount=“1000000”,然后显示的时候通过Binding (ItemsControl.AlternationIndex)来显示,序号是从0开始的,我们这里需要通过Converter来改变序号。
public class IndexConverter : IValueConverter
{
public int AddValue { get; set; }
public object Convert(object value, Type TargetType, object parameter, System.Globalization.CultureInfo culture)
{
int curentvalue = (int)(value);
curentvalue += AddValue;
return curentvalue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int curentvalue = (int)(value);
curentvalue -= AddValue;
return curentvalue;
}
}
函数定义好后需要添加Resources
<ListView.Resources>
<local:IndexConverter x:Key="IndexConverterNum" AddValue="1"/>
</ListView.Resources>
否则会报错,找不到IndexConverterNum
最后就运行就可以看到效果了。
点击CheckBox处理
我们可能还需要点击CheckBox进行数据变动。我们可以利用CheckBox的Tag来处理。
我们可以把编号添加到CheckBox的Tag,这样我们点击Tag就知道是哪一条数据了,这样做实现起来比较简单。或者也可以直接获取((TextBlock)cbBox.Content).Text,如果仅仅是个数字的话。
<GridViewColumn.CellTemplate >
<DataTemplate>
<CheckBox IsChecked="{Binding isEnable}" Tag="{Binding (ItemsControl.AlternationIndex) ,
RelativeSource={RelativeSource AncestorType=ListViewItem},Converter={StaticResource IndexConverterNum}}" Click="CheckBox_Click">
<TextBlock Text="{Binding (ItemsControl.AlternationIndex) ,
RelativeSource={RelativeSource AncestorType=ListViewItem},Converter={StaticResource IndexConverterNum}}" />
</CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
后台代码里
//点击规则开关
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
CheckBox cbBox = sender as CheckBox;
if (cbBox != null)
{
//((TextBlock)cbBox.Content).Text
int index = int.Parse(cbBox.Tag.ToString()) - 1;
lvRules.SelectedIndex = index;
}
}
ListView实现简单拖拽
首先xmsl里的Listview需要添加
AllowDrop="True" MouseMove="lvRules_MouseMove" Drop="lvRules_Drop"
首先鼠标移动事件增加
private void lvRules_MouseMove(object sender, MouseEventArgs e)
{
if (sender is ListView listview
&& e.LeftButton == MouseButtonState.Pressed
&& listview.SelectedItem != null)
{
DragDrop.DoDragDrop(listview, listview.SelectedItem, DragDropEffects.Move);
//tbStat.Text = "lvRules_MouseMove";
}
}
然后是释放
private void lvRules_Drop(object sender, DragEventArgs e)
{
object data = e.Data.GetData(typeof(RuleInfoData));
if (data is RuleInfoData)
{
//根据位置信息获得index
int insert_index = GetCurrentIndex(new GetPositionDelegate(e.GetPosition));
if (insert_index == -1)
return;
//这里就可以处理插入了。
}
}
private int GetCurrentIndex(GetPositionDelegate getPosition)
{
int index = -1;
if (lvRules.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
return index;
for (int i = 0; i < lvRules.Items.Count; ++i)
{
ListViewItem item = lvRules.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem;
if (item != null && this.IsMouseOverTarget(item, getPosition))
{
index = i;
break;
}
}
return index;
}
delegate Point GetPositionDelegate(IInputElement element);
private bool IsMouseOverTarget(Visual target, GetPositionDelegate getPosition)
{
Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
Point mousePos = getPosition((IInputElement)target);
return bounds.Contains(mousePos);
}
参考文献
https://stackoverflow.com/questions/660528/how-to-display-row-numbers-in-a-listview
https://blog.csdn.net/yysyangyangyangshan/article/details/8951677