2012-02-08 67 views
0

为listview写入很多这些东西。似乎有点臃肿首先设置的datacontext和套用绑定到文本与转换器绑定

<TextBlock DataContext="{Binding Path=SiteId, Converter={StaticResource siteConverter},ConverterParameter=SiteId}" Text="{Binding Path=SiteName}" ></TextBlock> 

有没有做的Text属性直接绑定

编辑 加满XAML澄清

<ListView SelectedItem="{Binding SelectedReport}" AlternationCount="2" Grid.Row="2" Name="reportList" ItemsSource="{Binding ReportsView}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch"> 
      <ListView.View> 
       <GridView> 
        <GridView.ColumnHeaderContextMenu> 
         <ContextMenu > 
          <MenuItem Header="Ascending" /> 
          <MenuItem Header="Descending" />  
         </ContextMenu> 
        </GridView.ColumnHeaderContextMenu> 
        <GridViewColumn Header="Action" CellTemplate="{StaticResource imageCell}" Width="Auto"/> 
        <GridViewColumn Header="Reportname" Width="Auto" CellTemplate="{StaticResource reportNameCell}"/> 
        <GridViewColumn Header="Site" Width="Auto" CellTemplate="{StaticResource reportSiteNameCell}"/> 
        <GridViewColumn Header="Company" Width="Auto" CellTemplate="{StaticResource reportCompanyNameCell}"/> 
        <GridViewColumn Header="Type" Width="Auto" DisplayMemberBinding="{Binding DocType}"/> 
        <GridViewColumn Header="Status" Width="Auto" DisplayMemberBinding="{Binding Status}"/> 
        <GridViewColumn Header="Created by" Width="Auto" DisplayMemberBinding="{Binding CreatedBy}"/> 
        <GridViewColumn Header="Language" Width="Auto" DisplayMemberBinding="{Binding CreatedBy}"/> 
        <GridViewColumn Header="Updated" Width="Auto" DisplayMemberBinding="{Binding Updated}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 

编辑 这是我如何加载我的ViewModel

ReportList = reportListService.Open(filePath); 
this.reportsView = CollectionViewSource.GetDefaultView(this.ReportList.Reports); 
this.reportsView.SortDescriptions.Add(
new SortDescription("ReportName", ListSortDirection.Ascending)); 

ReportList只包含siteid

回答

2

好,好......几件事情第一:

1)为什么你在SiteId传递作为ConverterParameter,以及它是绑定的对象。它是redundent的......你传入的参数与Convert方法的值和参数相同?

2)如果使用一个ListView,绑定ItemsSource到收集(优选可观察到的),然后使用一个DataTemplate作为ListView.ItemTemplate。如果DataTemplate可跨多个ListView s重复使用,则将其作为资源创建,并将ItemTemplate设置为绑定到资源。

或......更好的解决方案:从应该是的视图模型公开事物。听起来不像“SiteName”与视图相关的业务相关。因此,请在您的视图模型图层上添加转换器逻辑,并公开该附加属性。

+0

Bingo加载该类。感谢您以更好的方式总结它。 – 2012-02-08 21:09:18

+0

+1:这几乎是我想说的(至少就“或......”部分而言),但它绝对容易理解。 – Nuffin 2012-02-08 21:39:02

0

是的,你将视图本身的datacontext设置为ViewModel类。然后,所有你需要的控件做的是:

Text="{Binding StringPropertyToBindTo}" 
+0

对不起,因为SiteName不属于视图模型,只有SiteId,这就是为什么我需要转换 – klashagelqvist 2012-02-08 20:47:11

+0

如何获得siteName,它来自哪里代码? – 2012-02-08 20:49:20

+0

siteid是我viewmodel中reportclass的一个属性。我需要在ListView中显示sitename而不是siteid,并且通过将siteid发送到转换器来获取sitename – klashagelqvist 2012-02-08 20:53:57

0

最简单的方法将实现在数据上下文Site属性,它包含当前的转换器实现的功能。然后你可以很容易地绑定到Site.SiteName。只要确保数据上下文触发PropertyChanged事件为SiteSiteId设置为避免令人讨厌的意外。

但是,如果在没有通用接口或不同基类的情况下,将转换器用于具有相同参数的不同数据上下文,则上述方法是不切实际的。

+0

对不起,这样的麻烦,这将意味着我将不得不改变和膨胀我的datamodel只是为了显示sitename – klashagelqvist 2012-02-08 21:01:49

+0

你也可以把这个逻辑放入另一个类(转换器?),并只将方法调用包装在ViewModel中。这样你的虚拟机的代码将保持原样,你仍然有更方便的绑定语法。 – Nuffin 2012-02-08 21:13:09

+0

编辑我的问题来澄清。你的答案是否意味着我为包含属性SiteName的viewmodel创建了一个额外的类,然后用原始数据 – klashagelqvist 2012-02-08 21:34:50