2012-03-05 72 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方法,然後查看您的視圖模型。