我正在使用下面的Datagrid(使用MVVM模式),这里我想要的是,当我在组合框中选择某个东西时,ViewModel中应该发生某种通知,说此行的组合框selectedItem更改为该值。现在,通知发生在SelectedEname的Set方法中,该方法位于类SortedDetails(自定义实体)中,而不是视图模型的一部分。请查看下面的代码,并让我知道我们是否可以使用MVVM模式以任何方式向videmodel发送通知。
<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; }
}
}
我之所以问这个问题,是因为我想避免在codeehind中编写代码,但在这种情况下无法避免。所以,这里是解决方案(对我来说):-
添加一个事件委托或任何中介模式,它将通知ViewModel从组合框的SelectionChanged事件更改了选择。。。
您可以将ViewModel放在View的资源中,并绑定到ViewModel的属性:
<ComboBox x:Name="cmbEngagement" ItemsSource="{Binding EDetails, Mode=TwoWay}" DisplayMemberPath="EName" SelectedItem="{Binding SelectedEName, Mode=TwoWay, Source={StaticResource ViewModel}">
其中SelectedEName
是ViewModel的属性。
您希望使用某种机制允许事件调用视图模型上的命令或谓词(方法)。
例如,使用Caliburn.Micro中的Actions,您可以编写以下内容:
<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
方法,然后查看您的视图模型。