Avatar billede Slettet bruger
10. juni 2008 - 21:07 Der er 3 kommentarer

ObjectDataProvider i WPF, problemer ved udskiftning af object

Jeg har et antal business objecter, som jeg skal binde til WPF-kontroller run-time. Hvert business object har en readonly version (anvendes til lister) og en editabel version.

De implementerer alle INotifyPropertyChanged/-ing.

Scenariet er at jeg har en liste af liste af read-only versionen, som er bundet på en ListBox. Det går fint. Når brugeren vælger et object i listen, vil jeg opdatere et detail-billede med den editable version af det valgte object.

Jeg abonnerer på SelectionChanged på ListBox'en - og kan fint få fat i objektet jeg skal databinde på, men derfra og så få controllerne til at opdateres...

Den eneste sikre metode jeg har fundet, er at udskifte Bindingen på alle kontrollerne (vha. GetBindingExpression()), men det er ikke ligefrem en særlig elegant måde.

Jeg har prøvet at binde controllerne til properties på en privat variabel, hvor jeg så skifter værien på denne variabel. Det virker ikke.

Jeg har prøvet at binde på en ObjectDataProvider og så skifte objektinstansen herpå i SelectionChanged (.ObjectInstance  = _currentObject). Det virker ikke.

Er der nogen, der kender en skudsikker måde?
Avatar billede mysitesolution Nybegynder
21. juni 2008 - 18:57 #1
Lyder som om du gør problemet større end det er. Så vidt jeg kan læse ud fra hvad du skriver så er den eneste "kode" du skal skrive ObjectDataProvideren. Resten kan fint skrives i XAML.

I stedet for at bruge SelectionChanged eventen på ListBox, så bruger du bare Selected property på ListBox. Laver et eksempel hvis det er.

Hvorfor vil du både have en liste med readonly og editible? du behøver da kun en
Avatar billede mysitesolution Nybegynder
21. juni 2008 - 19:14 #2
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="ListBox_binding.Window1"
    x:Name="Window"
    Title="Window1"
    Width="640" Height="480">
    <Window.Resources>
        <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
              <x:XData>
                <Inventory xmlns="">
                      <Books>
                        <Book Title="XML in Action"/>
                        <Book Title="En anden"/>
                        <Book Title="Noget"/>
                      </Books>   
                </Inventory>
              </x:XData>
        </XmlDataProvider>
    </Window.Resources>
    <Grid x:Name="LayoutRoot">
        <ListBox Name="box" Margin="0,99,137,71" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Mode=Default, Source={StaticResource InventoryData}, XPath=/Inventory/Books/Book/@Title}" Width="166" HorizontalAlignment="Right"/>
        <TextBox HorizontalAlignment="Right" Margin="0,56,134,0" VerticalAlignment="Top" Width="169" Height="28" Text="{Binding Path=SelectedValue, ElementName=box, Mode=TwoWay, UpdateSourceTrigger=Default}" TextWrapping="Wrap"/>
    </Grid>
</Window>

Der er dog ikke 2-vejs binding her, men er kun fordi XMLDataProvider ikke understøtter det
Avatar billede Slettet bruger
21. juni 2008 - 22:12 #3
Performance og state.

Jeg kan have flere tusinde objekter i listen og op imod 25 samtidige brugere, som kan rette i dem. Derfor loader jeg dem i en readonly version, hvor databasen står for at hydrate mine data. Når brugeren så vil editere et af objekterne, loader jeg præcis det objekt fra databasen i en editabel version. Derved har jeg en større sandsynlighed for at data ikke når at blive 'stale'.

Jeg er ved at forsøge om jeg kan gøre det via en TypeConverter eller en IValueConverter. Bliver lidt bøvlet, men jeg kan muligvis slippe for den ene af mine objectdataproviders, og dermed have løst den gordiske knude.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I dag 10:28 PDFEngine Af barth i Andet software
I går 22:40 Butte indhold i celler Af lurup i Excel
I går 15:24 Power Query Af djsimonsen i Excel
I går 14:43 Hvis ikke på liste, tilføj værdier til liste Af TheLibrarian i Excel
I går 11:33 Windows 11 Af ranni i Windows