大家好我正在使用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控制这个属性被调用但是我不想要这个,因为我想在我的主视图模型中,我在哪里错了?
我应该在我的班次模型类中声明它,但是这样我会直接将我的模型绑定到我的视图中吗?
答案 0 :(得分:1)
使用DataContextProxy或RelativeSource绑定。这将允许您的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}" />