Привязка данных Silverlight во вложенных элементах управления - PullRequest
0 голосов
/ 13 мая 2011

Привет, ребята, я работаю с SL4 и MVVM-приложением. На самом деле я застрял там, где я мог бы что-то делать неправильно, поэтому вам нужна ваша помощь, вот мой сценарий

//suodo code 
public class EmployeeModel
{
    //code
    Public List<Shifts> Employeeshifts{get;set;}
}

public class ShiftModel
{
    //code
}

Viewmodel для главной страницы

public class MainVM
{
    MainVM()
    {
        EmployeeList = DateFromSomeService;
    }
    Public List<Employees> EmployeeList{get;set}
    Public DelegateCommand ClickBindingCommand{get;set;} 
}

MainPage.xaml

<ItemsControl ItemSource={Binding EmployeeList}>
    <ItemTemplate>
        <DataTemplate>
            <controls:EmployeeControl/>
        </DataTemplate>
    </ItemTemplate>
</ItemsControl>

Employeecontro.xaml

<ItemsControl ItemSource={Binding EmployeeShifts}>
    <ItemTemplate>
        <DataTemplate>
            <controls:ShiftControl  Click={Binding ClickBindingCommand}/>//here is problem this command is in mainviewmodel
        </DataTemplate>
    </ItemTemplate>
</ItemsControl>

MainPage.cs

this.DataContext = new MainVM();

ClickBindingCommand определен в основной ВМ, но он связан с управлением сдвигом, а контекст данных shiftcontrol - это класс смещения, который является моим классом модели. Если я объявляю эту команду в своем классе модели смены, чем она работает, значит, если я нажимаю на элемент управления сменой, это свойство вызывается, но я не хочу этого, потому что я хочу его в своей модели основного вида, где я ошибаюсь?

Должен ли я объявить это в своем классе сменной модели, но таким образом я напрямую свяжу свою модель с моим видом?

Ответы [ 3 ]

1 голос
/ 30 июня 2011

Используйте DataContextProxy или RelativeSource Binding.Это позволит вашей Команде связывать / запускать на вашей MainViewModel.

Другой альтернативой является использование Caliburn Micro framework.Затем вы можете прикрепить действие к своей кнопке в дочернем элементе, и события щелчка всплывают над родительским элементом.

0 голосов
/ 30 июня 2011

Я столкнулся с той же самой проблемой, и для меня было исправлено присвоение имени UserControl, а затем ссылка на это имя в привязке.

Вот синтаксис:

{BindingElementName = SomeTextBox, Path = Text}

Привязать к свойству «Text» элемента XAML элемента с именем = «SomeTextBox» или x: Name = «SomeTextBox».

Так вот мой пользовательский элемент управления:

<UserControl
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"             
             x:Class="SupportReports.Workflow.Portfolio.PortfolioManager"
             mc:Ignorable="d"
             Name="PortfolioManagerControl"
             >

А вот вложенный шаблон данных, который привязывается к моей команде в моей модели основного вида

<cmd:EventToCommand Command="{Binding ElementName=PortfolioManagerControl, Path=DataContext.PortfolioManagerProjectSelectedCommand}" CommandParameter="{Binding Text, ElementName=ProjectName}" />
0 голосов
/ 30 июня 2011

Этот «инструментарий» предлагает реализацию FindAncestor в silverlight. Попробуйте это:

http://blog.thekieners.com/2010/09/08/relativesource-binding-with-findancestor-mode-in-silverlight/

...