繁体   English   中英

与转换器绑定

[英]Binding with converter

为listview写了很多这些。 看起来有点臃肿,首先设置datacontext和应用绑定到Text

<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

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

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

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

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

是的,您将View本身的datacontext设置为ViewModel类。 那么你需要为控件做的就是:

Text="{Binding StringPropertyToBindTo}"

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM