<
ListView
ItemsSource
=
"{Binding theList}"
Grid.Row
"2"
local:DynamicBindingListView.GenerateColumnsGridView
"True"
local:DynamicBindingListView.DateFormatString
"MM/dd/yyyy"
>
ListView.View
GridView
></
</
Imports
System.ComponentModel
System.Collections.Specialized
System.Reflection
Public
Class
DynamicBindingListView
Shared
Function
GetGenerateColumnsGridView(
ByVal
element
As
DependencyObject)
Boolean
If
Is
Nothing
Then
Throw
New
ArgumentNullException(
"element"
)
End
Return
element.GetValue(GenerateColumnsGridViewProperty)
Sub
SetGenerateColumnsGridView(
DependencyObject,
value
element.SetValue(GenerateColumnsGridViewProperty, value)
ReadOnly
GenerateColumnsGridViewProperty
_
DependencyProperty = DependencyProperty.RegisterAttached(
"GenerateColumnsGridView"
, _
GetType
(
?),
(DynamicBindingListView), _
FrameworkPropertyMetadata(
,
AddressOf
thePropChanged))
GetDateFormatString(
String
element.GetValue(DateFormatStringProperty)
SetDateFormatString(
element.SetValue(DateFormatStringProperty, value)
DateFormatStringProperty
"DateFormatString"
),
))
thePropChanged(
obj
e
DependencyPropertyChangedEventArgs)
Dim
lv
ListView =
CType
(obj, ListView)
descriptor
DependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ListView.ItemsSourceProperty,
(ListView))
descriptor.AddValueChanged(lv,
EventHandler(
ItemsSourceChanged))
Private
ItemsSourceChanged(sender
Object
, e
EventArgs)
(sender, ListView)
its
IEnumerable = lv.ItemsSource
itsEnumerator
IEnumerator = its.GetEnumerator
hasItems
= itsEnumerator.MoveNext()
SetUpTheColumns(lv, itsEnumerator.Current)
SetUpTheColumns(theListView
ListView, firstObject
theClassProperties
PropertyInfo() = firstObject.
().GetProperties()
gv
GridView = theListView.View
For
Each
pi
PropertyInfo
In
columnName
= pi.Name
grv
GridViewColumn
With
{.Header = columnName}
pi.PropertyType
(DateTime)
bnd
Binding(columnName)
formatString
= theListView.GetValue(DateFormatStringProperty)
formatString <>
.Empty
bnd.StringFormat = formatString
BindingOperations.SetBinding(grv, TextBlock.TextProperty, bnd)
grv.DisplayMemberBinding = bnd
Else
gv.Columns.Add(grv)
Next
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
System.ComponentModel;
System.Collections.Specialized;
System.Reflection;
System.Windows.Controls;
System.Windows.Threading;
System.Windows;
System.Collections;
System.Windows.Data;
namespace
CSharpVersioon
{
public
class
static
bool
GetGenerateColumnsGridView(DependencyObject element)
if
(element ==
null
throw
new
);
}
return
)element.GetValue(GenerateColumnsGridViewProperty);
void
SetGenerateColumnsGridView(DependencyObject element,
value)
element.SetValue(GenerateColumnsGridViewProperty, value);
readonly
DependencyProperty GenerateColumnsGridViewProperty = DependencyProperty.RegisterAttached(
typeof
(DynamicBindingListView),
, thePropChanged));
string
GetDateFormatString(DependencyObject element)
)element.GetValue(DateFormatStringProperty);
SetDateFormatString(DependencyObject element,
element.SetValue(DateFormatStringProperty, value);
DependencyProperty DateFormatStringProperty = DependencyProperty.RegisterAttached(
));
thePropChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
ListView lv = (ListView)obj;
DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(ListView.ItemsSourceProperty,
(ListView));
EventHandler(ItemsSourceChanged));
private
ItemsSourceChanged(
object
sender, EventArgs e)
ListView lv = (ListView)sender;
IEnumerable its = lv.ItemsSource;
IEnumerator itsEnumerator = its.GetEnumerator();
hasItems = itsEnumerator.MoveNext();
(hasItems)
SetUpTheColumns(lv, itsEnumerator.Current);
SetUpTheColumns(ListView theListView,
firstObject)
PropertyInfo[] theClassProperties = firstObject.GetType().GetProperties();
GridView gv = (GridView)theListView.View;
foreach
(PropertyInfo pi
in
theClassProperties)
columnName = pi.Name;
GridViewColumn grv =
GridViewColumn { Header = columnName };
.ReferenceEquals(pi.PropertyType,
(DateTime)))
Binding bnd =
Binding(columnName);
formatString = (
)theListView.GetValue(DateFormatStringProperty);
(formatString !=
.Empty)
bnd.StringFormat = formatString;
BindingOperations.SetBinding(grv, TextBlock.TextProperty, bnd);
grv.DisplayMemberBinding = bnd;
else
gv.Columns.Add(grv);
sqlguy edited Revision 4. Comment: Added C# version of the code
sqlguy edited Revision 1. Comment: Added a How does it work section