我在Datagrid下使用,(使用MVVM模式),这里我想要的是当我在组合框中选择某些内容时,ViewModel中会发生某种通知,说明此Row的组合框selectedItem已更改为此值。现在,通知发生在SelectedEname的Set方法中,该方法位于SortedDetails类(自定义实体)内,而不是viewmodel的一部分。请查看下面的代码并告诉我们如果我们可以使用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; }
}
}
答案 0 :(得分:1)
我问这个问题的原因是因为我希望避免在代码隐藏中编写代码,但在这种情况下无法避免相同的问题。所以,这是解决方案(对我来说): -
添加一个事件委托或任何中介模式,它将通知ViewModel选择从Combobox的SelectionChanged事件中更改...
答案 1 :(得分:0)
您可以将ViewModel放在View的资源中并绑定到ViewModel的属性:
<ComboBox x:Name="cmbEngagement" ItemsSource="{Binding EDetails, Mode=TwoWay}" DisplayMemberPath="EName" SelectedItem="{Binding SelectedEName, Mode=TwoWay, Source={StaticResource ViewModel}">
其中SelectedEName
是ViewModel的属性。
答案 2 :(得分:0)
您希望使用某种机制来允许事件在视图模型上调用命令或动词(方法)。
例如,在Actions中使用Caliburn.Micro,您可以编写以下内容:
<ComboBox x:Name="cmbEngagement" ...
cal:Message.Attach="[Event SelectionChanged] = [Action EngagementChanged($dataContext)]>
并在您的视图模型中:
public void EngagementChanged(SortedDetails details)
{
// access details.Name here
}
请注意,Caliburn.Micro中的操作会冒泡,因此它会首先在EngagementChanged
类型上查找SortedDetails
方法,然后查看您的视图模型。