使用项目模板和复杂集合时设置列表框的选定项目

时间:2014-01-23 20:39:15

标签: wpf mvvm listbox

我有一个带有项目模板的wpf列表框

<ListBox Margin="2" Background="{x:Null}" BorderBrush="{x:Null}" HorizontalContentAlignment="Stretch" ItemsSource="{Binding AgencyItems}"  SelectedItem="{Binding Path=SelectedAgency, Mode=TwoWay}"  SelectedValuePath="AgencyName" ItemTemplate="{DynamicResource agencyItemsTemplate}">
  <i:Interaction.Triggers>
      <i:EventTrigger EventName="SelectionChanged">
        <ei:CallMethodAction 
            TargetObject="{Binding}"
            MethodName="GetSubmittedItems"/>
       </i:EventTrigger>
  </i:Interaction.Triggers>
</ListBox>

数据模板

<DataTemplate x:Key="agencyItemsTemplate">
            <Grid HorizontalAlignment="Stretch">
                <Grid.RowDefinitions>
                    <RowDefinition Height="0.62*"/>
                    <RowDefinition Height="0.38*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Rectangle Fill="#FF4485B6" Margin="1" Grid.RowSpan="2" Stroke="#FFA1A1A1"  RadiusX="3" RadiusY="3" StrokeThickness="0.6" />
                <TextBlock Margin="0,2,2,2" TextWrapping="Wrap" Text="{Binding Path=SubmittedItemsCount, StringFormat='Total Items: {0}'}" Grid.Row="1" FontSize="13.333" TextAlignment="Right"/>
                <TextBlock Margin="5,2,2,2" TextWrapping="Wrap" Text="{Binding Path=AgencyName}" VerticalAlignment="Stretch" FontWeight="Bold" FontSize="14.667" Grid.RowSpan="1"/>
            </Grid>
        </DataTemplate>

绑定到列表框的集合包含两个属性,您可以在数据模板中看到这些属性

public class SubmitingAgencyItem
{
    public string AgencyName { get; set; }
    public int SubmittedItemsCount { get; set; }
}

在ViewModel中,我的属性设置为inotify(注意我使用的是SimpleMVVM框架,因此INPC事件通过这个lamda表达式处理)

private string selectedAgency;
        public string SelectedAgency
        {
            get { return selectedAgency; }
            set
            {
                selectedAgency = value;
                NotifyPropertyChanged(m => m.SelectedAgency);
            }
        }

使用事件触发器/混合行为

将selectionChanged事件路由到VM
<i:Interaction.Triggers>
     <i:EventTrigger EventName="SelectionChanged">

     <ei:CallMethodAction 
         TargetObject="{Binding}"
         MethodName="GetContributorAgencies"/>
     </i:EventTrigger>

项目来源是通过Viewmodel

的方法设置的
public void GetContributorAgencies()
        {          
            SubmissionPurgeModel pm = new SubmissionPurgeModel();

            if (SelectedContributor != null)
            {
                AgencyItems = pm.GetContributorData(SelectedContributor);

            }         
        }

代理商商品是SubmittingAgencyItem

的observableCollection

使用复杂类型时,如何将所选项的一个属性传递给viewmodel?我已经尝试了SelectedValueSelectedValuePath,但它似乎只是将对象命名空间传递回viewmodel?

0 个答案:

没有答案