嵌套控件中的Silverlight数据绑定

时间:2011-05-12 21:14:32

标签: silverlight-4.0 mvvm mvvm-light

大家好我正在使用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在主VM中定义,但它在shift控件中绑定,而shiftcontrol的数据上下文是shift类,它是我的模型类。如果我在我的shift模型类中声明这个命令而不是它的工作,意味着如果我点击shift控制这个属性被调用但是我不想要这个,因为我想在我的主视图模型中,我在哪里错了?

我应该在我的班次模型类中声明它,但是这样我会直接将我的模型绑定到我的视图中吗?

3 个答案:

答案 0 :(得分:1)

使用DataContextProxyRelativeSource绑定。这将允许您的Command绑定/触发您的MainViewModel。

另一种方法是使用Caliburn Micro框架。然后,您可以将操作附加到子项中的按钮,单击事件将冒泡到父项。

答案 1 :(得分:0)

这个“工具包”提供了Silverlight中FindAncestor的实现。试试这个:

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

答案 2 :(得分:0)

我遇到了同样的问题,为我修复的是命名我的UserControl,然后在绑定中引用该名称。

以下是语法:

{Binding ElementName = SomeTextBox,Path = Text}

绑定到元素XAML的“Text”属性 name =“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"
             >

这是嵌套的dataTemplate,它绑定到我的主视图模型中的命令

<cmd:EventToCommand Command="{Binding ElementName=PortfolioManagerControl, Path=DataContext.PortfolioManagerProjectSelectedCommand}" CommandParameter="{Binding Text, ElementName=ProjectName}" />