绑定Combobox列的selectedItem属性Silverlight MVVM

时间:2012-03-05 09:56:41

标签: silverlight mvvm silverlight-4.0

我在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; }
        }

}

3 个答案:

答案 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方法,然后查看您的视图模型。