This question is locked. New answers and comments are not allowed.
Hello,
I have some problems with my application and created a simple demo project to show the behavior. As far as i can tell, this was behaving differently before we upgraded to "2012.1.326.1040".
A simple screen with a datagrid and three buttons - build columns, load data, and export data. Add a breakpoint in the SearchResultItem converter, click Build Columns, and then LoadData... Notice that the converter runs twice - once with the proper converterparameter and once with null...
Then try exporting the data and notice that the converter reruns multiple times again and obviously fails miserably because the values and parameters are all wrong.
Did something change? Am I doing something incorrectly? Why do the converters run twice on initial load?
asdasd
I have some problems with my application and created a simple demo project to show the behavior. As far as i can tell, this was behaving differently before we upgraded to "2012.1.326.1040".
A simple screen with a datagrid and three buttons - build columns, load data, and export data. Add a breakpoint in the SearchResultItem converter, click Build Columns, and then LoadData... Notice that the converter runs twice - once with the proper converterparameter and once with null...
Then try exporting the data and notice that the converter reruns multiple times again and obviously fails miserably because the values and parameters are all wrong.
Did something change? Am I doing something incorrectly? Why do the converters run twice on initial load?
<
UserControl
x:Class
=
"SilverlightApplication19.MainPage"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
>
<
Grid
x:Name
=
"LayoutRoot"
Background
=
"White"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
Height
=
"1*"
/>
</
Grid.RowDefinitions
>
<
Button
Grid.Row
=
"0"
Content
=
"Build Columns"
Click
=
"BuildColumns"
/>
<
Button
Grid.Row
=
"1"
Content
=
"Load Data"
Click
=
"LoadData"
/>
<
Button
Grid.Row
=
"2"
Content
=
"Export"
Click
=
"ExportData"
/>
<
telerik:RadGridView
x:Name
=
"rgv"
Grid.Row
=
"3"
AutoGenerateColumns
=
"False"
ItemsSource
=
"{Binding list}"
/>
</
Grid
>
</
UserControl
>
using
System;
using
System.Globalization;
using
System.IO;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Data;
using
Telerik.Windows.Controls;
using
System.Collections.ObjectModel;
using
System.ComponentModel;
namespace
SilverlightApplication19
{
public
partial
class
MainPage : UserControl
{
ViewModel vm =
new
ViewModel();
public
MainPage()
{
InitializeComponent();
}
private
void
BuildColumns(
object
sender, RoutedEventArgs e)
{
rgv.Columns.Clear();
var gvdc1 =
new
GridViewDataColumn()
{
IsReadOnly =
true
,
Header =
"id column"
,
Width =
new
GridViewLength(100),
DataMemberBinding =
new
Binding()
{
Converter =
new
SearchResultItem(),
ConverterParameter =
"id"
,
Mode = BindingMode.OneWay
},
DataType =
typeof
(
string
)
};
rgv.Columns.Add(gvdc1);
var gvdc2 =
new
GridViewDataColumn()
{
IsReadOnly =
true
,
Header =
"name column"
,
Width =
new
GridViewLength(100),
DataMemberBinding =
new
Binding()
{
Converter =
new
SearchResultItem(),
ConverterParameter =
"name"
,
Mode = BindingMode.OneWay
},
DataType =
typeof
(
string
)
};
rgv.Columns.Add(gvdc2);
}
private
void
LoadData(
object
sender, RoutedEventArgs e)
{
vm.list =
new
System.Collections.ObjectModel.ObservableCollection<DataObject>()
{
new
DataObject() { id = 1, name =
"a"
},
};
this
.DataContext = vm;
}
private
void
ExportData(
object
sender, RoutedEventArgs e)
{
SaveFileDialog dialog =
new
SaveFileDialog()
{
DefaultExt =
"xls"
,
Filter = String.Format(
"{1} files (*.{0})|*.{0}|All files (*.*)|*.*"
,
"xls"
,
"Excel"
),
FilterIndex = 1
};
if
(dialog.ShowDialog() ==
true
)
{
using
(Stream stream = dialog.OpenFile())
{
rgv.Export(stream,
new
GridViewExportOptions()
{
Format = ExportFormat.ExcelML,
ShowColumnHeaders =
true
,
});
}
}
}
}
public
class
SearchResultItem : IValueConverter
{
public
object
Convert(
object
value, Type targetType,
object
parameter, CultureInfo culture)
{
if
(parameter ==
null
)
return
"parameter was null"
;
else
if
(parameter.ToString() ==
"id"
)
return
(value
as
DataObject).id;
else
if
(parameter.ToString() ==
"name"
)
return
(value
as
DataObject).name;
else
return
"wtf"
;
}
public
object
ConvertBack(
object
value, Type targetType,
object
parameter, CultureInfo culture)
{
return
DependencyProperty.UnsetValue;
}
}
public
class
ViewModel : Notify
{
private
ObservableCollection<DataObject> _list =
new
ObservableCollection<DataObject>();
public
ObservableCollection<DataObject> list
{
get
{
return
_list; }
set
{ _list = value; RaisePropertyChanged(
"list"
); }
}
}
public
class
DataObject : Notify
{
private
int
_id = 0;
public
int
id
{
get
{
return
_id; }
set
{ _id = value; RaisePropertyChanged(
"id"
); }
}
private
string
_name =
null
;
public
string
name
{
get
{
return
_name; }
set
{ _name = value; RaisePropertyChanged(
"name"
); }
}
}
public
class
Notify : INotifyPropertyChanged
{
public
event
PropertyChangedEventHandler PropertyChanged;
protected
void
RaisePropertyChanged(
string
propertyName)
{
PropertyChangedEventHandler propertyChanged = PropertyChanged;
if
((propertyChanged !=
null
))
{
propertyChanged(
this
,
new
PropertyChangedEventArgs(propertyName));
}
}
}
}