与转换器绑定

时间:2012-02-08 20:41:20

标签: c# binding converter

为列表视图编写了很多这些内容。看起来有点臃肿,首先设置datacontext并将apply绑定到Text

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

是否直接在文本属性

中进行绑定

EDIT 添加了完整的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>

EDIT 这就是我加载我的viewmodel

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

ReportList仅包含siteid

3 个答案:

答案 0 :(得分:2)

好吧,好吧......先做几件事:

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

2)如果您使用ListView,请将ItemsSource绑定到集合(最好是可观察的),然后使用DataTemplate作为ListView.ItemTemplate。如果DataTemplate可以跨多个ListView重用,则将其创建为资源并将ItemTemplate设置为绑定到资源。

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

答案 1 :(得分:0)

是的,您将View本身的datacontext设置为ViewModel类。然后,您需要为控件执行的操作是:

Text="{Binding StringPropertyToBindTo}"

答案 2 :(得分:0)

最简单的方法是在数据上下文中实现Site属性,该属性包含转换器当前实现的功能。然后,您可以轻松绑定到Site.SiteName。设置PropertyChanged时,只需确保数据上下文触发Site SiteId事件,以避免令人讨厌的意外。

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