×

wpf中使用ListView_wpf listview

前端技术网 前端技术网 发表于2024-02-02 13:40:23 浏览1829 评论0

抢沙发发表评论

一、wpf中listview控件的使用

<ListView Grid.Column="0"

HorizontalAlignment="Stretch"

wpf中使用ListView_wpf listview

Name="lsv"

ItemsSource="{Binding}"><!--这里说明数据来源,是绑定的-->

<ListView.View>

<GridView x:Name="grv">

<GridViewColumn Width="50"

DisplayMemberBinding="{Binding Column1}"//这个和asp.net里的意思是一样的

wpf中使用ListView_wpf listview

Header="Header1">

</GridViewColumn>

</GridView>

</ListView.View>

</ListView>

-------------------------------------------------------------

这是xaml

在后台给你的这个listview指定一个DataContext,貌似DataTable和List<obj>都可以。xaml里,Column1是字段名。如果是DataTable就是列名,如果是List<obj>就是对象属性名

lsv.DataContext= dataTable;//类似的一句话

-------------------------------------------------------------

其实wpf在某些地方和asp.net相当的类似,这里的操作方式不是和asp.net里面的GridView使用非常相似么?

二、wpf中 listView 更加字段值不同 用不同的ItemTemplate

listview后台绑定数据**,根据**中某字段不同使用不同ItemTemplate

根据楼主的问题我根据不同情况给出不同方案:(方便起见,我拿listbox做例子)

1.**中某字段不同是指**中每个实体对象的这一字段统一都发生改变:

我的思路是首先创建一个**类,listbox的itemtemplate绑定**值通过转换器拿到想要的DataTemplate

页面的资源:

<Window.Resources>

<converter:TempConverter x:Key="myTempConverter"/>

<DataTemplate x:Key="temp1">

<StackPanel Orientation="Horizontal">

<TextBlock Text="temp1" Margin="0 0 10 0"/>

<TextBlock Text="{Binding Name}"/>

</StackPanel>

</DataTemplate>

<DataTemplate x:Key="temp2">

<StackPanel Orientation="Horizontal">

<TextBlock Text="temp2" Margin="0 0 10 0"/>

<TextBlock Text="{Binding Name}"/>

</StackPanel>

</DataTemplate>

</Window.Resources>

前台:

<ListBox ItemsSource="{Binding pList}" ItemTemplate="{Binding pList,Converter={StaticResource myTempConverter}}" Height="200" x:Name="listBox1" Width="120"/>

后台:

public class People

{

public bool IsTemp1{ get; set;}

public string Name{ get; set;}

}

public class PeopleList

{

public ObservableCollection<People> pList{ get; set;}

}

转换器类:

public class TempConverter:IValueConverter

{

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

{

List<People> datalist=(List<People>)value;

Window1 window=new Window1();

DataTemplate template= new DataTemplate();

if(datalist[0].IsTemp1== true)

{

template= window.Resources["temp1"] as DataTemplate;

}

else

{

template= window.Resources["temp2"] as DataTemplate;

}

return template;}

。。。

第二种情况:**中某字段不同是指**中每个实体对象的这一字段不同时发生改变:

那我建议只建立一个datatemplate。里面的内容可以放两套:

<DataTemplate x:Key="temp">

<Grid>

<StackPanel Orientation="Horizontal">

<TextBlock Text="temp1" Margin="0 0 10 0"/>

<TextBlock Text="{Binding Name}"/>

</StackPanel>

<StackPanel Orientation="Horizontal">

<TextBlock Text="temp2" Margin="0 0 10 0"/>

<TextBlock Text="{Binding Name}"/>

</StackPanel>

</Grid>

</DataTemplate>

然后每套的显示绑定该属性,通过转换器转换成可见性即可。

<StackPanel Orientation="Horizontal" Visibility="{Binding属性,converter={...}">

三、WPF中的ListBox,ListView和DataGridView有什么区别

ListView控件是一种从 ListBox派生而来的 ItemsControl。通常,该控件的项是数据**的成员,并且表示为 ListViewItem对象。

ListBox是一个 ItemsControl,这意味着它可以包含任何类型(如字符串、图像或面板)对象的**。有关更多信息,请参见 ItemsControl类。

ListBox中有多个项可见,这与 ComboBox不同,后者只有选定项可见,除非 IsDropDownOpen属性为 true。 SelectionMode属性确定一次是否可选择 ListBox中的多个项。

wpf没有DataGridView,只有DataGrid。

DataGrid控件提供一种灵活的方式显示一个数据在行和列中。 DataGrid包括内置列类型和模板列承载的自定义内容。内置行类型包含可用于在单元格值下显示附加内容的下拉详细信息部分。

wpf中可以说控件没有明确区分,可以通过修改template修改显示样式。

四、WPF如何获得ListView内各单元格控件

------------------

首先不推荐这种模式

ItemsSource已经绑定了源. Items**的数量变化很随机,每个单元格的控件取决於

默认的DataTemplate(设置 DisplayMemberBinding时)或者

CellTemplate定义的控件,或者

CellTemplateSelector指定的 Template定义的控件.

通过 rowIndex和 cellIndex来取得某单元格控件其实不是好的解决问题的办法.你完全可以在数据层面上捕抓到改变,然后根据改变后的值判断是否应该采用新值,而不应在 UI元素上下功夫.

------------------

回到问题,

如何取得在单元格中承载数据的控件?(这里所说的单元格是指, ListView的 View是 GridView或其衍生类的某一个承载数据的东西).

要取得,必须要了解. ListView是一种 Items的控件,它的每一个 Item都由 ListViewItem作为容器来承载它要显示的内容.

ListView

ListViewItem1

ListViewItem2

...

即使在 DataTemplate没有使用 ListViewItem, ListView显示时也使用 ListViewItem来承载它.对於使用 GridView的 ListView来说,每一个 ListViewItem的控件树结构就像下面所示的:

ListViewItem(default, non-styled)

Border

GridViewRowPresenter

ContentPresenter 1

承载数据所用的控件1(你问题的目标控件就是这个了,单元格1)

ContentPresenter 2

承载数据所用的控件2(单元格2)

...

ContentPresenter N

承载数据所用的控件N(单元格N)

显然, ContentPresenter的 Content正是我们目标所要得到的东西.

於是有了下面的函数:

private UIElement GetListViewCellControl(int rowIndex, int cellIndex)

{

// rowIndex和 cellIndex基於 0.

//首先应得到 ListViewItem,毋庸置疑,所有可视UI元素都继承了UIElement:

UIElement u= lv.ItemContainerGenerator.ContainerFromIndex(rowIndex) as UIElement;

if(u==null) return null;

//然后在 ListViewItem元素树中搜寻单元格:

while((u=(VisualTreeHelper.GetChild(u, 0) as UIElement))!= null)

if(u is GridViewRowPresenter) return VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(u, cellIndex), 0) as UIElement;

return u;

}

这个函数就返回了单元格的控件,是 UIElement,对应的,如果你 DataTemplate是使用 TextBox承载数据的,它的返回值就是一个 TextBox,如果你用 CheckBox承载数据,它的返回值就是一个 CheckBox, and so on,例如:

TextBox t= GetListViewCellControl(1, 2) as TextBox;//第2行,第3格

CheckBox t= GetListViewCellControl(3, 4) as CheckBox;//第4行第 5格

...

总言,这是一种不好的方式,这种方式使用了 WinForm的模式来操纵数据,它并不适合 wpf.

感谢您的阅读!希望本文对解决您关于wpf中使用ListView_wpf listview和wpf中listview控件的使用的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。