绑定组合框列的选定项属性 Silverlight MVVM



我正在使用下面的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方法,然后查看您的视图模型。

最新更新