【问题标题】:Bind to display member of combo box in item template绑定到项目模板中组合框的显示成员
【发布时间】:2015-05-29 10:44:02
【问题描述】:

我有一个组合框,用于设置显示成员属性。

<dxe:ComboBoxEdit EditValue="{Binding MyEditVale}" ItemsSource="{Binding MyListOfObjects}" DisplayMember="{Binding MyDisplayMember}" ItemTemplate="{StaticResource ColoredTemplate}"/>

但是,我想在项目模板中使用显示成员属性。

 <DataTemplate x:Key="ColoredTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <StackPanel Grid.Column="0" ToolTip="This entry has been made obsolete please select another option" Background="Red" Visibility="{Binding IsObsolete, Converter={StaticResource BooleanToVisibilityConverter}}"/>
                <TextBlock  Grid.Column="1" Text="{*I want to bind to the display member here*}" Margin="2,0,0,0"/>
            </Grid>
        </DataTemplate>

我很难让它发挥作用。 出于测试目的,我一直在使用此代码。

<TextBlock  Grid.Column="1" Text="{Binding Name}" Margin="2,0,0,0"/>

我绑定的对象确实有一个 Name 属性,但可能存在其他不可用的实例。

有什么办法可以直接使用/绑定item模板中的display member属性?

【问题讨论】:

    标签: c# wpf data-binding devexpress


    【解决方案1】:

    您可以使用DisplayMemberPath 或ItemTemplate,但不能同时使用两者。

    DisplayMemberPath

    <ComboBox ItemsSource="{Binding Path=MyListOfObjects}" DisplayMemberPath="Name"/>
    

    项目模板

    <ComboBox ItemsSource="{Binding Path=MyListOfObjects}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="10"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
    
                    <StackPanel Grid.Column="0" ToolTip="This entry has been made obsolete please select another option" Background="Red" Visibility="{Binding IsObsolete, Converter={StaticResource BooleanToVisibilityConverter}}"/>
                    <TextBlock  Grid.Column="1" Text="{Binding Path=Name}" Margin="2,0,0,0"/>
                </Grid>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    

    【讨论】:

      【解决方案2】:

      看看这对你有没有帮助

      <TextBlock  Grid.Column="1" Text="{Binding DisplayMember, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dxe:ComboBoxEdit}}}" Margin="2,0,0,0"/>
      

      【讨论】:

      • 我试过了,下拉列表中的文本是“名称”,所以它确实链接到显示成员,但它带回了字符串值而不是获取“名称”属性的值对象
      【解决方案3】:

      MyListOfObjects 必须是对象的集合,并且“名称”必须是对象项的属性,那么它应该可以工作。我从post 中获取了一个代码 sn-p(使用 ListBox,但对于 Combobox 应该相同)。

      <ListBox Grid.Row="0" ItemsSource="{Binding SelectedFiles}" Grid.IsSharedSizeScope="True">
          <ListBox.ItemTemplate>
              <DataTemplate>
                  <Grid>
                      <Grid.ColumnDefinitions>
                          <ColumnDefinition SharedSizeGroup="col0"></ColumnDefinition>
                          <ColumnDefinition SharedSizeGroup="col1"></ColumnDefinition>
                          <ColumnDefinition SharedSizeGroup="col2"></ColumnDefinition>
                      </Grid.ColumnDefinitions>
                      <TextBlock Grid.Column="0" Text="{Binding Name}" Margin="10,0"></TextBlock>
                      <TextBlock Grid.Column="1" Text="{Binding Length}" Margin="10,0"></TextBlock>
                      <TextBlock Grid.Column="2" Text="{Binding LastAccessTime}" Margin="10,0"></TextBlock>
                  </Grid>
              </DataTemplate>
          </ListBox.ItemTemplate>
      </ListBox>
      

      SelectedFiles 只是一个 FileInfo 列表

      public List<FileInfo> SelectedFiles
      {
          get;
          set;
      }
      

      【讨论】:

      • 目前 MyListOfObjects 是一个具有名为 Name 的属性的集合。但是,情况可能并非总是如此,因此我无法将项目模板的文本框中的绑定硬编码为 Name。这是我需要能够使用显示成员的方式,以便可以动态设置绑定
      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多