MVVM Light - основные / дочерние представления и свойства зависимостей - PullRequest
0 голосов
/ 19 апреля 2010

У меня возникает странная проблема при реализации основного / дочернего представления и пользовательских свойств зависимостей.

Внутри моего masterView я декларативно связываю модель представления в XAML следующим образом:

 DataContext="{Binding MainViewModelProperty, Source={StaticResource Locator}}"

и мой MainViewModel предоставляет видимую коллекцию, которую я привязываю к ItemsControl следующим образом:

        <ItemsControl ItemsSource="{Binding Lists}" Height="490" Canvas.Top="10" Width="70">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Canvas>
                    <local:TaskListControl Canvas.Left="{Binding ListLeft}" 
                                           Canvas.Top="{Binding ListTop}" 
                                           Width="{Binding ListWidth}" 
                                           Height="{Binding ListHeight}"
                                           ListDetails="{Binding}"/>
                    </Canvas>    
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>    

TaskListControl в свою очередь объявляет и привязывается к его ViewModel, и я также определил свойство зависимости для свойства ListDetails.

Свойство ListDetails не устанавливается, и если я удаляю декларативную ссылку на его viewmodel, обратный вызов свойства зависимостей действительно срабатывает.

Есть ли конфликт с декларативной привязкой к моделям представления и определенным свойствам зависимостей?

Мне действительно нравится смешиваемость MVVM Light, и я хочу решить эту проблему, поэтому любая помощь будет оценена.

Если вы хотите получить исходный код моего проекта, пожалуйста, спросите

1 Ответ

0 голосов
/ 23 апреля 2010

Я не уверен, что полностью понимаю вашу проблему, но давайте попробуем угадать. Когда вы говорите о «декларативном связывании с viewmodel», вы на самом деле имеете в виду «императивно», как в «в коде» вместо «в» XAML "?

Если это так, то вам нужно понимать, что это переопределяет наследование DataContext от родителя, а свойство ListDetails теперь ссылается на TaskListControl DataContext, а не на DataContext DataTemplate больше.

Это легко изменить, например, с помощью:

<ItemsControl ItemsSource="{Binding Lists}" 
              Height="490" 
              Canvas.Top="10" 
              Width="70">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Canvas x:Name="RootPanel">
                <local:TaskListControl Canvas.Left="{Binding ListLeft}" 
                                       Canvas.Top="{Binding ListTop}" 
                                       Width="{Binding ListWidth}" 
                                       Height="{Binding ListHeight}"
                                       ListDetails="{Binding ElementName=RootPanel, 
                                           Path=DataContext}"/>
            </Canvas>    
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Будет ли это работать? Laurent

...