Hallo mensen,
Achtergrond:
Boekhoudings applicatie voor ZZP.
Probleem
We gebruiken een datagrid om bepaalde data weer te geven. In combinatie met DataSets en MVVM gebruiken we bindings om bij bepaalde data te komen. Om dan bijvoorbeeld een nieuwe transactie in te voeren willen we d.m.v. autocompletion een stukje usability invoeren.Echter door WPFToolkit autocompletebox conflicteert hij met de ItemsSource op een hele rare manier.
We halen alle accounts op uit de database. Die had ik in eerste instantie gewoon zo als ItemsSource geset, echter werd ons aangeraden om een provider en een value converter te gebruiken, dit zou eventueel het probleem zelfs hebben opgelost maar dit deed het echter niet.
In de UI doet hij als je op enter drukt niet de data wijzigen die je hebt opgegeven in de autocompletebox. code staat beneden
LookupProvider.cs
ValueConverter
De itemssource is gebonden aan de provider. als er text wordt ingevoerd wordt deze naar de converter doorgespeeld en zal dus de code terug moeten geven voor dat account. en de uiteindelijke geselecteerde item moet dus naar de account_id worden gebind zodat hij gewijzigd wordt in de database/dataset.
Enig idee wat ik verkeerd doe, want of het gaat totaal niet werken onze situatie, of ik heb ergens iets verkeerds geplaatst met een variabelen. echter zoals ik het nu zie zou hij het zo doen.
Bronnen voor voorbeeld:
http://www.astaticstate.com/2010/04/binding-combobox-and-autocomplete.html
met vriendelijke groeten
Rikkos
Achtergrond:
Boekhoudings applicatie voor ZZP.
Probleem
We gebruiken een datagrid om bepaalde data weer te geven. In combinatie met DataSets en MVVM gebruiken we bindings om bij bepaalde data te komen. Om dan bijvoorbeeld een nieuwe transactie in te voeren willen we d.m.v. autocompletion een stukje usability invoeren.Echter door WPFToolkit autocompletebox conflicteert hij met de ItemsSource op een hele rare manier.
We halen alle accounts op uit de database. Die had ik in eerste instantie gewoon zo als ItemsSource geset, echter werd ons aangeraden om een provider en een value converter te gebruiken, dit zou eventueel het probleem zelfs hebben opgelost maar dit deed het echter niet.
In de UI doet hij als je op enter drukt niet de data wijzigen die je hebt opgegeven in de autocompletebox. code staat beneden
LookupProvider.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| using BalanceNet.Database; using BalanceNet.Database.BalanceNetDataSetTableAdapters; namespace BalanceNet.Library { public class AccountLookupProvider { private AccountTableAdapter _adapter; private BalanceNetDataSet.AccountDataTable _context; public AccountLookupProvider() { _adapter = new AccountTableAdapter(); _context = _adapter.GetAccounts(); } public BalanceNetDataSet.AccountDataTable Accounts { get { return _context; } } } } |
ValueConverter
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Windows.Data; namespace BalanceNet.Library { class AccountValueConverter : IValueConverter { private AccountLookupProvider _provider; public AccountValueConverter() { _provider = new AccountLookupProvider(); } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if(value == null) return "fail1"; string input; try { input = System.Convert.ToString(value); } catch(Exception e) { return null; } IEnumerable<string> rows = from accounts in _provider.Accounts where input == accounts.code select accounts.code; if(rows.Count() > 0) { return rows.FirstOrDefault(); } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { // not implemented if(value == null) { return null; } return null; } } } |
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Account_id}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <sdk:AutoCompleteBox HorizontalAlignment="Left" ItemsSource="{Binding Accounts, Source={StaticResource lookupProvider}}" ValueMemberBinding="{Binding code}" SelectedItem="{Binding Account_id, Mode=TwoWay}" Text="{Binding code, Mode=TwoWay, Converter={StaticResource accountConverter}}" > <sdk:AutoCompleteBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding code}" /> </StackPanel> </DataTemplate> </sdk:AutoCompleteBox.ItemTemplate> </sdk:AutoCompleteBox> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> |
De itemssource is gebonden aan de provider. als er text wordt ingevoerd wordt deze naar de converter doorgespeeld en zal dus de code terug moeten geven voor dat account. en de uiteindelijke geselecteerde item moet dus naar de account_id worden gebind zodat hij gewijzigd wordt in de database/dataset.
Enig idee wat ik verkeerd doe, want of het gaat totaal niet werken onze situatie, of ik heb ergens iets verkeerds geplaatst met een variabelen. echter zoals ik het nu zie zou hij het zo doen.
Bronnen voor voorbeeld:
http://www.astaticstate.com/2010/04/binding-combobox-and-autocomplete.html
met vriendelijke groeten
Rikkos