【问题标题】:Binding Combobox column's selectedItem property Silverlight MVVM绑定 Combobox 列的 selectedItem 属性 Silverlight MVVM
【发布时间】:2012-03-05 09:56:41
【问题描述】:

我在下面使用 Datagrid,(使用 MVVM 模式),这里我想要的是当我在组合框中选择某些内容时,ViewModel 中应该会发生某种通知,说明该行的组合框 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; }
        }

}

【问题讨论】:

    标签: silverlight mvvm silverlight-4.0


    【解决方案1】:

    我问这个问题的原因是因为我希望避免在代码隐藏中编写代码,但在这种情况下无法避免相同的情况。所以,这是解决方案(对我来说):-

    添加一个事件委托或任何中介模式,它将通知 ViewModel 从 Combobox 的 SelectionChanged 事件更改选择...

    【讨论】:

      【解决方案2】:

      你可以把你的 ViewModel 放到 View 的资源中并绑定到 ViewModel 的属性:

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

      SelectedEName 是您的 ViewModel 的属性。

      【讨论】:

        【解决方案3】:

        您希望使用某种机制来允许事件在您的视图模型上调用命令或动词(方法)。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-07
          • 1970-01-01
          • 1970-01-01
          • 2011-11-24
          • 2021-02-15
          • 2011-02-24
          • 2015-09-29
          • 1970-01-01
          相关资源
          最近更新 更多