1

WPF スタイルに続いて、ハードコードされた列名 (名前とコード) を一般化して、このスタイルを ComboBox に実際に適用するときに指定できるようにする方法はありますか? さらに良いことに、列の数を変更することさえできれば?

 <Style TargetType="ComboBox" x:Key="MultiColumnComboBoxStyle">
        <Style.Resources>
            <Style TargetType="ComboBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ComboBoxItem">
                            <Border>
                                <Grid HorizontalAlignment="Stretch" TextElement.FontWeight="Normal">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="Auto" />
                                        <ColumnDefinition Width="Auto" SharedSizeGroup="Code" />
                                    </Grid.ColumnDefinitions>

                                    <TextBlock Grid.Column="0" Text="{Binding Path=Name}" />
                                    <Rectangle Grid.Column="1" Width="1" Fill="Black" />
                                    <TextBlock Grid.Column="2" Text="{Binding Path=Code}" Margin="5,0,5,0" />
                                </Grid>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Style.Resources>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <StackPanel Grid.IsSharedSizeScope="True" IsItemsHost="True" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>
4

1 に答える 1

0

スタイルを使用する代わりに、列の依存関係プロパティを使用してカスタム コントロールを作成することを検討できます。

少しセットアップが必要ですが、特に再利用したい場合は、ニーズをよりよく満たします。

例は次のようになります。これらの一部は、入力できるはずの疑似コードです。

<!-- In your generic.xaml file -->
<Style TargetType="MyCustomComboBox" >
  <Setter Property="Template" >
     <Setter.Value>
        <ControlTemplate TargetType="MyCustomComboBox" >
            <!-- your template code goes here -->
            <Grid x:Name="_myCustomGrid />
         </ControlTemplate> 
      </Setter.Value>
  </Setter>
</Style>

 //then in a cs file inherit from the combo box
public class MyCustomColumnComboBox : ComboBox //get all the combobox functionality
{
     public IList ComboColumns 
     { 
          get { return (IList)GetValue(ComboColumnsProperty);} 
          set { SetValue(ComboColumnsProperty,value);} 
     }
     public static readonly DependencyProperty ComboColumnsProperty = DependencyProperty.RegisterProperty(...);

     private Grid _grid;

     public override OnApplyTemplate() 
     {
         //pull your template grid info here, then use that when setting the columns.
         _grid = GetTemplateChild("_myCustomGrid") as Grid;
         //from here you can check to see if you have your list yet, 
         //if you don't then you maintain the grid for when you do have your list.
         // This can behave different depending on if you are in wpf or silverlight,
         // and depending on how you were to add the items to the dependency property.
     }
}

要約すると、カスタム依存関係プロパティを使用してカスタム コントロールを追加し、theme/generic.xaml でテンプレートをドロップして、on apply テンプレート関数でテンプレートにプルするものにグリッドの名前を付けます。そこから、セットアップの準備ができているか、依存関係プロパティで指定した列をセットアップできます。

注 : 依存関係プロパティは実際には必要ありませんが、後で必要に応じて変更コールバックで依存関係プロパティなどを使用して更新する際に、もう少し柔軟性を高めるのに役立ちます。

于 2013-02-19T05:47:20.633 に答える