Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[WPF] Nested Databinding probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een volgende data template:

<DataTemplate DataType={x:Type bll:Task}">
<ComboBox />
<ComboBox />
</DataTemplate>

Deze datatemplate wil ik gebruiken in een ContentControl of in een ListView. Nu is alleen het geval dat op basis van de data in de Task klasse de data sources van de datatemplate moeten worden ingesteld. Wanneer ik een lijst met Task klassen heb, kunnen de datasources van de Comboboxen, dus per Task verschillen. Hoe kan ik dit het beste aanpakken?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je je Task niet een dependency property DataSource geven die aan de hand van zijn data de juiste datasource terug geeft?

Of eventueel verschillende datatemplates maken ( Die eventueel inheritten van elkaar ) en dan aan de hand van een DataTemplateSelector de juiste datatemplate weergeven.

Voor zover ik weet is er niet zoiets als een DataSourceSelector

[ Voor 49% gewijzigd door Woy op 01-02-2008 11:00 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ja, in deze richting heb ik ook al wel gedacht. De dependency property DataSource is een idee, maar dan bevuil je de bedrijfslogica met logica voor de user interface. Dat vind ik dus in eerste instantie minder mooi.

Met de DataTemplateSelector bedoel je dat je dat per DataTemplate een andere ItemsSource selecteert?

Ik heb ook nog zitten denken in de richting van de ObjectDataProvider. Dan zou ik bijvoorbeeld de MethodParameters kunnen instellen, maar kan dit ook dynamisch worden ingesteld en dat dan ook declaratief op basis van de Task?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je hebt nu een Template voor Task en daarin heb je een ComboBox die telkens een verschillende DataSource moet hebben. Dus maak je meerdere temlates
code:
1
2
3
4
5
6
7
8
9
<DataTemplate DataType={x:Type bll:Task}" x:Name="HighPriorityTemplate">
    <ComboBox  ItemsSource="{Binding Path=Resources"}/><ComboBox />
</DataTemplate>
<DataTemplate DataType={x:Type bll:Task}" x:Name="LowPriorityTemplate">
    <ComboBox  ItemsSource="{Binding Path=IetsAnders"}/><ComboBox />
</DataTemplate>
<local:MyDataTemplateSelector x:Key="myDataTemplateSelector"/>
....
<ListBox ItemsSource="{Binding Source={StaticResource myList}}" ItemTemplateSelector="{StaticResource myDataTemplateSelector}" />

en dan iets van de volgende DataTemplateSelector
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MyDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        Task task = item as Task;
        if (task != null)
        {
            Window window = Application.Current.MainWindow;
            if (taskitem.Priority == 1)
                return window.FindResource("HighPriorityTemplate") as DataTemplate;
            else
                return window.FindResource("LowPriorityTemplate") as DataTemplate;
        }
        return null;
    }
}


Je hebt gelijk dat het niet zo mooi is om een DataSource property toe te voegen als het een bussinuss object is. Als het echt een View object is is dat natuurlijk minder erg.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ok, dit zit er op zich goed uit uit.

Wanneer ik nu de volgende XAML code heb. Is dan het volgende mogelijk?

<ObjectDataProvider x:Key="TaskList" ObjectType="{x:Type bll:TaskManager}" MethodName="GetTasksFilteredByName">
<ObjectDataProvider.MethodParameters>
<system.String>Dynamisch hier een naam op toe te voegen, op basis van de template waar deze objectdataprovider in is gedefinieerd?</system.String>
<ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Volgens mij is de MethodParameters geen DependencyProperty dus dan zou je er niet dynamisch tegen kunnen binden.

Ik bedenk me net een andere manier om op verschillende DataSources te binden. Je zou een Task->IEnumerable Converter kunnen schrijven en dan binden op je Task en De converter de juiste datasource terug laten geven.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[ValueConversion(typeof(Task), typeof(IEnumerable))]
public class TaskToDataSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Task task = item as Task; 
        if (task != null) 
        {
            if (taskitem.Priority == 1) 
                return Task.SomeDataSource; 
            else 
                return Task.SomeOtherDataSource; 
        } 
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

code:
1
2
3
4
5
6
<Resouces>
    <local:TaskToDataSourceConverter x:Key="myTaskToDataSourceConverter" />
</Resources>
<DataTemplate DataType={x:Type bll:Task}">
    <ComboBox ItemsSource="{Binding Converter={StaticResource myTaskToDataSourceConverter}}"/>
</DataTemplate>


Ik heb het niet getest, maar ik denk dat zoiets wel zou moeten werken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1