2012-03-05 77 views
1

我正在使用下面的Datagrid(使用MVVM模式),在这里我想要的是当我选择组合框中的某些东西时,应该在ViewModel中发生某种通知,说该行的组合框selectedItem被更改为这个值。现在通知发生在SelectedEname的Set方法中,该方法位于类SortedDetails(自定义实体)内部,而不是viewmodel的一部分。请查看下面的代码,并让我知道如果我们可以使用MVVM模式以任何方式将通知发送到videmodel。Binding Combobox列的selectedItem属性Silverlight MVVM

<c1:C1DataGrid x:Name="datagrid1" ItemsSource="{Binding Path=SortedDetailsList,Mode=TwoWay}" AutoGenerateColumns="False"> 
       <c1:C1DataGrid.Columns> 
        <c1:DataGridTextColumn Header="Name" Binding="{Binding Name, Mode=TwoWay}"/> 

        <c1:DataGridTemplateColumn Header="ENGAGEMENT"> 
         <c1:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <ComboBox x:Name="cmbEngagement" ItemsSource="{Binding EDetails, Mode=TwoWay}" DisplayMemberPath="EName" SelectedItem="{Binding SelectedEName,Mode=TwoWay}"> 
           </ComboBox> 
          </DataTemplate> 
         </c1:DataGridTemplateColumn.CellTemplate> 
        </c1:DataGridTemplateColumn> 
       </c1:C1DataGrid.Columns> 
      </c1:C1DataGrid> 

SortedDetailsList是SortedDetails实体的名单,它看起来像这样: -

public class SortedDetails 
{ 
Private string name; 
Private ObservableCollection<details> eDetails; 
Private details selectedEname; 

     public string Name 
     { 
      get { return name; } 
      set { name = value; } 
     } 

     public ObservableCollection<details> EDetails 
     { 
      get { return eDetails; } 
      set { eDetails = value; } 
     } 

     public details SelectedEname 
     { 
      get { return selectedEname; } 
      set { selectedEname = value; } 
     } 
} 


public class Details 
{ 
Private string eName; 
Private int eId; 

     public string EName 
     { 
      get { return eName; } 
      set { eName = value; } 
     } 

     public int EId 
     { 
      get { return eId; } 
      set { eId = value; } 
     } 

} 

回答

1

我之所以问这个问题的原因是因为我正在寻求避免在代码隐藏中编写代码,但在这种情况下无法避免相同。所以,这里是解决方案(对我来说): -

添加一个事件代理或任何介体模式,它将通知ViewModel选择已从Combobox的SelectionChanged事件中更改...

0

你可以把你的ViewModel在视图的资源和绑定到视图模型的财产:

<ComboBox x:Name="cmbEngagement" ItemsSource="{Binding EDetails, Mode=TwoWay}" DisplayMemberPath="EName" SelectedItem="{Binding SelectedEName, Mode=TwoWay, Source={StaticResource ViewModel}"> 

其中SelectedEName是您的ViewModel的一个属性。

0

您想要使用某种机制来允许事件在视图模型上调用命令或动词(方法)。

例如,使用Caliburn.MicroActions,你可以写:

<ComboBox x:Name="cmbEngagement" ... 
    cal:Message.Attach="[Event SelectionChanged] = [Action EngagementChanged($dataContext)]> 

,并在您的视图模型:

public void EngagementChanged(SortedDetails details) 
{ 
    // access details.Name here 
} 

注意,在Caliburn.Micro泡沫的动作,所以它会首先在SortedDetails类型上寻找EngagementChanged方法,然后查看您的视图模型。