Everest
Everest

Reputation: 580

Binding Combobox column's selectedItem property Silverlight MVVM

I am using below Datagrid, (using MVVM pattern), here what I want is when I select something in the combobox, some kind of notification should happen in the ViewModel saying that this Row’s combobox selectedItem is changed to this value. Right now the notification is happening in the Set method of SelectedEname which is inside class SortedDetails(custom entity) and not a part of viewmodel. Please have a look at the code below and let me know If we can send the notification to videmodel in any way using MVVM pattern.

<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 is a list of SortedDetails entity, which looks like this :-

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

}

Upvotes: 1

Views: 1913

Answers (3)

Everest
Everest

Reputation: 580

The reason i was asking this question was because i was looking to avoid writing code in codebehind, but in this case not able to avoid the same. So, here is the solution (for me) :-

Add an event delegate or any mediator pattern which will inform the ViewModel that selection is changed from the SelectionChanged event of Combobox...

Upvotes: 1

devdigital
devdigital

Reputation: 34349

You want to use some mechanism for allowing events to invoke commands or verbs (methods) on your view model.

For example, using Actions in Caliburn.Micro, you could write the following:

<ComboBox x:Name="cmbEngagement" ... 
    cal:Message.Attach="[Event SelectionChanged] = [Action EngagementChanged($dataContext)]>

and in your view model:

public void EngagementChanged(SortedDetails details)
{
   // access details.Name here
}

Note that actions in Caliburn.Micro bubble, so it would first look for an EngagementChanged method on SortedDetails type, and then look on your view model.

Upvotes: 0

Zabavsky
Zabavsky

Reputation: 13640

You can put your ViewModel in the View's resources and bind to the property of ViewModel:

<ComboBox x:Name="cmbEngagement" ItemsSource="{Binding EDetails, Mode=TwoWay}" DisplayMemberPath="EName" SelectedItem="{Binding SelectedEName, Mode=TwoWay, Source={StaticResource ViewModel}">

where SelectedEName is a property of your ViewModel.

Upvotes: 0

Related Questions