【问题标题】:Binding with converter与转换器绑定
【发布时间】:2012-03-01 08:17:09
【问题描述】:

为列表视图编写了很多这些内容。首先设置数据上下文和应用绑定到文本似乎有点臃肿

<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>

编辑 这就是我加载视图模型的方式

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

ReportList 只包含 siteid

【问题讨论】:

    标签: c# binding converter


    【解决方案1】:

    好的,好吧...首先有几件事:

    1) 你为什么将 SiteId 作为 ConverterParameter 传递,并且它是绑定的对象。它是多余的...您传递的参数与 Convert 方法的值和参数相同?

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

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

    【讨论】:

    • 宾果游戏。感谢您以更好的方式总结。
    • +1:这也是我想说的(至少就“或...”部分而言),但它肯定更容易理解。
    【解决方案2】:

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

    Text="{Binding StringPropertyToBindTo}"
    

    【讨论】:

    • 很抱歉,属性 SiteName 不在 viewmodel 中,只有 SiteId ,这就是我需要转换的原因
    • 如何获取siteName,代码中哪里来的?
    • siteid 是我的视图模型中报告类的属性。我需要在列表视图中显示站点名称而不是站点 ID,并且我通过将站点 ID 发送到转换器来获取站点名称
    • 澄清一下,我的代码有效。只是我似乎没有必要首先通过转换器获取 texblock 的数据上下文,然后设置 bining
    • 为什么不在视图模型中完成转换,当您绑定时,您将返回 SiteName。
    【解决方案3】:

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

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

    【讨论】:

    • 抱歉打扰了,这意味着我必须更改和膨胀我的数据模型才能显示站点名称
    • 您也可以将该逻辑放入另一个类(转换器?)中,并且只将方法调用包装在您的 ViewModel 中。这样一来,您的 VM 代码将几乎保持原样,并且您仍然拥有更方便的绑定语法。
    • 编辑了我的问题以澄清。您的回答是否暗示我为包含属性 SiteName 的视图模型创建一个额外的类,然后使用原始数据加载该类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2011-03-13
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多