我环顾四周,发现了一些东西,现在卡在下拉列表中显示有两列的组合框中。我有一个可用的xaml主题,并且定义了组合框“样式”,并且可以按预期正常运行,因此该部分还可以。

现在,我有一个组合框,需要显示两个值,将其视为下拉菜单的状态缩写和状态名称,来自项目的DataTable.DefaultView绑定(bind)源。

如果我有

<my:cboStates TextSearch.TextPath="StateAbbrev">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal" TextSearch.Text="{Binding Path=StateAbbrev}">
        <TextBlock Text="{Binding Path=StateAbbrev}"/>
        <TextBlock Text="{Binding Path=FullStateName}" Margin="10 0"/>
      </StackPanel>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</my:cboStates>

这可行。现在,如何/在何处卡住...现在,我希望在5种不同的表单上具有相同的功能,并且所有表单都显示相同的内容,并且是否曾经更改过(不是此更改,而是针对其他多列组合框),我不想一直将其直接放在表单的XAML文件中。

我希望将其放入主题的资源字典文件中,并不断重复使用该“样式”。说得通。但是,当我这样做并且绑定(bind)到数据表时,当我尝试作为样式进行操作时,获得的唯一结果是下拉列表显示的值为
System.Data.DataRowView
System.Data.DataRowView
System.Data.DataRowView
System.Data.DataRowView

而不是实际的2列。
这是“主题”资源字典中的内容。
<DataTemplate x:Key="myStateComboTemplate" >
  <StackPanel Orientation="Horizontal"  >
    <TextBlock Text="{Binding Path=StateAbbrev}"/>
    <TextBlock Text="{Binding Path=FullStateName}"/>
  </StackPanel>
</DataTemplate>

<Style x:Key="StyleMyStatesCombobox" TargetType="{x:Type ComboBox}"
  BasedOn="{StaticResource MyOtherWorkingComboBoxStyle}" >
  <Setter Property="TextSearch.TextPath" Value="{Binding Path=StateAbbrev}" />
  <Setter Property="ItemTemplate" Value="{StaticResource myStateComboTemplate}" />
</Style>

因此,如果我在窗体上创建了两个实例“cboStates”类,并将其中一个设置为首先列出的显式样式,然后将第二个实例设置为基于“样式”设置的SECOND,则第二个实例将仅显示重复的System.Data而失败.DataRowView条目,而不是实际数据内容。

我想念的是什么。

所以,要澄清我在找什么...
州... ex数据
AL Alabama
AK Alaska
AZ Arizona
AR Arkansas
CA California
CO Colorado
CT Connecticut
DE Delaware

我希望组合框显示缩写
AL,AK,AZ等和更窄的组合框。返回时,它也将是“SelectedValue”。

实际的下拉列表将显示上面列出的数据,同时显示缩写和状态的详细描述。

所需组合框的样本

最佳答案

最终使它奏效了……对于那些尝试类似的人。由于我试图拥有一个可以在整个过程中使用的标准“类”实例,但又不想在每个页面中明确地硬引用XAML,因此必须在实际的代码内类实例中处理部分样式。

由于我不完全知道.net框架如何/何时在其中构建所有控件,样式分配等,因此,我感到沮丧的是,如果直接从xaml直接运行它会起作用,但是在代码中失败。因此,我最终在代码中强制了项目模板和TextSearch.TextPath值。这是类的一小段

public class myStatesCombo : ComboBox
{
   public myStatesCombo()
   {
      Loaded += myAfterLoaded;
   }

   protected static DataTable myTableOfStates;

   public void myAfterLoaded()
   {
      if( myTableOfStates == null )
        myTableOfStates = new DataTable();

      CallProcedureToPopulateStates( myTableOfStates );

      ItemsSource = myTableOfStates.DefaultView;

      // AFTER the object is created, and all default styles attempted to be set,
      // FORCE looking for the resource of the "DataTemplate" in the themes.xaml file
      object tryFindObj = TryFindResource("myStateComboTemplate" );
      if( tryFindObj is DataTemplate )
         ItemTemplate = (DataTemplate)tryFindObj;

      // NOW, the CRITICAL component missed in the source code
      TextSearch.SetTextPath( this, "StateAbbrev" );
   }
}

现在,特别说明。在我用来填充DataTable的例程中,我预先检查该表是否存在。第一次,我创建表。如果我需要重新填充它,如果每次都只做一个“新的DataTable”,它会破坏数据/项目模板的绑定(bind)。为了防止这种情况,我会做
if( myTableOfStates.Rows.Count > 0 )
  myTableOfStates.Rows.Clear();

然后,我给我打电话

Sqlexecute调用从数据库查询(DataAdapter)并填充()数据表。

因此,现在看来一切都已正确填充,显示和文本搜索的绑定(bind)已完成,可以使用了。

关于c# - WPF样式组合框在下拉列表中有两列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13979483/

10-11 17:34
查看更多