DRa*_*app 7 c# wpf combobox styles multiple-columns
我环顾四周,找到了一些东西,然后卡在一个组合框中,下拉区域显示两列.我有一个xaml主题可用,并且组合框"Style"被定义并且在预期中运行良好,因此该部分是可以的.
现在,我有一个组合框,我需要显示两个值,将其视为状态缩写和下拉列表的状态名称,来自DataTable.DefaultView项目的绑定源.
如果我有
<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>
Run Code Online (Sandbox Code Playgroud)
这很有效.现在,我被困在哪里/哪里...现在,我希望在5个不同的表格上显示相同的功能,并且所有内容都显示相同的内容,如果有的话(不是这个,但对于其他多列组合框),我不想将其直接放在表单的XAML文件中.
我希望把它放入一个主题的资源字典文件中,然后一遍又一遍地重复使用"风格".说得通.但是,当我这样做,并且绑定到数据表时,我尝试做一个Style时得到的唯一结果是下拉列表显示的值
System.Data.DataRowView
System.Data.DataRowView
System.Data.DataRowView
System.Data.DataRowView
Run Code Online (Sandbox Code Playgroud)
而不是实际的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>
Run Code Online (Sandbox Code Playgroud)
所以,如果我有两个实例,我在表单上创建了"cboStates"类,并将其中一个设置为首先列出的显式样式,而将SECOND设置为基于"样式"设置,则第二个实例仅通过显示重复的System.Data而失败. .DataRowView条目,而不是实际的数据内容.
我错过了什么
所以,澄清我正在寻找的......国家......前数据
AL Alabama
AK Alaska
AZ Arizona
AR Arkansas
CA California
CO Colorado
CT Connecticut
DE Delaware
Run Code Online (Sandbox Code Playgroud)
我希望组合框显示缩写的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" );
}
}
Run Code Online (Sandbox Code Playgroud)
现在,特别说明一下。在我用来填充数据表的例程中,我预先检查该表是否存在。第一次,我创建了表格。如果我需要重新填充它,如果我每次都继续执行“新数据表”,它就会破坏数据/项目模板绑定。为了防止这种情况,我会这样做
if( myTableOfStates.Rows.Count > 0 )
myTableOfStates.Rows.Clear();
Run Code Online (Sandbox Code Playgroud)
然后,我打电话给我的
Sqlexecute 调用从数据库 (DataAdapter) 查询并 Fill() 数据表。
因此,现在所有内容似乎都已正确填充,显示和文本搜索的绑定已完成并准备就绪。
归档时间: |
|
查看次数: |
4845 次 |
最近记录: |