1

これは私の app.xaml ファイルにあります (省略):

<Application.Resources>
    <x:Array x:Key="SongTitleString" Type="local:ComboBoxItemString">
        <local:ComboBoxItemString ValueString = "Song 1"/>
        <local:ComboBoxItemString ValueString = "Song 2"/>
        <local:ComboBoxItemString ValueString = "Song 3"/>
    </x:Array>
</Application.Resources>

これはクラスです:

namespace OCLMEditor
{
    /// This class provides us with an object to fill a ComboBox with
    /// that can be bound to string fields in the binding object.
    public class ComboBoxItemString
    {
        public string ValueString { get; set; }
    }
}

これはマークアップです:

<ComboBox x:Name="comboSongOpen" ItemsSource="{StaticResource SongTitleString}" 
    DisplayMemberPath="ValueString" 
    SelectedValuePath="ValueString" 
    SelectedValue="{Binding SongTitle}">
    <ComboBox.MaxWidth>
        <Binding Path="ActualWidth" 
            ElementName="textWeeklyBibleReading"/>
    </ComboBox.MaxWidth>
</ComboBox>

すべて良い。この問題は、曲のタイトルがコンボに表示されるときに、曲のタイトルの前に 3 桁の数字を付けたいということです。例えば:

001 - Song 1
002 - Song 2
003 - Song 3

最終的には、アプリケーションの他の場所で、コンボ ボックスで選択されたインデックスを使用して、リソースから適切な曲名 (接頭辞なし) を取得したいと考えています。

これは可能ですか?

アップデート:

XML を作成する場合:

<?xml version="1.0" encoding="utf-8" ?>
<Settings>
  <SongTitles>
    <SongTitle Number="1" Title = "Jehovah's Attributes"/>
  </SongTitles>
</Settings>

そして、それをリソースとして WPF に追加します。

<Window.Resources>
    <XmlDataProvider x:Key="XmlData" Source="OCLM_Resources.xml" XPath="Settings/SongTitles" />
</Window.Resources>

次に使用します。

<ComboBox x:Name="comboSongOpen"
           ItemsSource="{Binding Source={StaticResource XmlData}, XPath=./SongTitle}" DisplayMemberPath="@Title">
    <ComboBox.MaxWidth>
        <Binding Path="ActualWidth" 
            ElementName="textWeeklyBibleReading"/>
    </ComboBox.MaxWidth>
</ComboBox>

ドロップにタイトルを表示します。ItemTemplateしかし、属性 (0.000 をフォーマットするため) を一緒に使用および/またはスティッチングすることについて、頭を悩ませることはできません。

4

4 に答える 4

3

これは非常に単純な純粋な xaml ソリューションです。他のものを変更する必要はありません。

            //add this to your resource.  Obviously you should put this in code if you have lots of items
            <AlternationConverter x:Key="AlternateForegroundConverter">
                <s:Int16>1</s:Int16>
                <s:Int16>2</s:Int16>
                <s:Int16>3</s:Int16>
                <s:Int16>4</s:Int16>
                <s:Int16>5</s:Int16>
                //more if necessary
            </AlternationConverter>

        <ComboBox x:Name="comboSongOpen" ItemsSource="{StaticResource SongTitleString}" SelectedValuePath="ValueString" SelectedValue="{Binding SongTitle}" AlternationCount="99999" >
            <ComboBox.ItemTemplate>
                <DataTemplate DataType="local:ComboBoxItemString">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding (ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType=ListBoxItem}, StringFormat='000 - ', Converter={StaticResource AlternateForegroundConverter}}" />
                        <TextBlock Text="{Binding ValueString}" />
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
            <ComboBox.MaxWidth>
                <Binding Path="ActualWidth" ElementName="textWeeklyBibleReading"/>
            </ComboBox.MaxWidth>

編集: この名前空間が必要です

xmlns:s="clr-namespace:System;assembly=mscorlib"

編集:更新された質問への回答

DataTemplate を変更します (この場合、AlternationConverter は必要ありません)。

        <ComboBox.ItemTemplate>
            <DataTemplate DataType="local:ComboBoxItemString">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Number, StringFormat='000 - '}" />
                    <TextBlock Text="{Binding ValueString}" />
                </StackPanel>
            </DataTemplate>

//add Number property to you class
public class ComboBoxItemString
{
    public string ValueString { get; set; }
    public int Number { get; set; }
}

//add the array
<x:Array x:Key="SongTitleString" Type="local:ComboBoxItemString">
    <local:ComboBoxItemString ValueString = "Song 1" Number = "1" />
    <local:ComboBoxItemString ValueString = "Song 2" Number = "2" />
    <local:ComboBoxItemString ValueString = "Song 3" Number = "3" />
</x:Array>

しかし、大きなものがあります。あなたのリストは正しいです。ただし、アイテムを選択すると、ComboBox には「001 - エホバの属性」も表示されます。「Jehovah's Attributes」のみを表示するには、コントロール テンプレートを変更する必要があります。

于 2016-06-17T20:52:53.733 に答える
1

OPに関する私のコメントによると、これはもっと提案だと思います:

曲リストをファイルにオフロードすると、アプリケーションを初期化して曲リストを作成するときにファイルを読み込むことができます。ファイルの実際の構造はあなた次第です。値をカンマで区切る簡単な方法であるため、通常は CSV ファイルが使用されますが、任意の区切り記号を使用できます。

この場合、C# でファイルを読み取る簡単な方法がいくつかあるとすれば、曲名を改行で区切ることをお勧めします。これを行う場合、曲リストをコンパイルするのは次のように簡単です。

string[] songList = System.IO.File.ReadAllLines(@"songlist.txt");
for (int i = 0; i < songList.Length; i++) {
     string newItem = ((i+1).ToString()) + " " + songList[i];
     combo1.Items.Add(newItem);
}

また

List<string> songs = new List<string>();
for (int i = 0; i < songList.Length; i++) {
     songs.Add((i + 1).ToString() + " " + songList[i]);
}

combo1.ItemsSource = songs;

したがって、これらの例では、コンボボックスの内容は次のようになります

1 ソング 1

2 ソング 2

編集:投稿の最後の部分に従って

最終的には、アプリケーションの他の場所で、コンボ ボックスで選択されたインデックスを使用して、リソースから適切な曲名 (接頭辞なし) を取得したいと考えています。

あなたの例では、フォーマットは001 - Song 1

接頭辞を付けずに曲のタイトルだけが必要selectedIndexな場合は、いくつかのオプションがあります。

1) アプリケーションの初期化時に作成する 2 番目のリストには、単にプレフィックスが含まれていない可能性があります。リストをコンパイルするときは、2 番目のリストを作成し、プレフィックスなしで曲名を追加します。selectedIndexのプロパティを使用して、このリストを参照できますComboBox

2)selectedIndexプロパティを使用してから、文字列操作のいくつかのバリエーションを使用して、曲名だけを抽出できます。

string[] selectedSong = combo1.Items[0].ToString().Split('-');

この例では、プレフィックスのない曲名は inside になりますselectedSong[1]

于 2016-06-17T20:04:24.683 に答える
0

prepend を使用して DisplayMemberPath を追加するだけです

<Application.Resources>
    <x:Array x:Key="SongTitleString" Type="local:ComboBoxItemString">
        <local:ComboBoxItemString ValueString = "Song 1" ValueStringLong = "# 1 Song 1"/>
        <local:ComboBoxItemString ValueString = "Song 2" ValueStringLong = "# 2 Song 1"/>
        <local:ComboBoxItemString ValueString = "Song 3" ValueStringLong = "# 3 Song 1"/>
    </x:Array>
</Application.Resources>

DisplayMemberPath="ValueStringLong"

于 2016-06-17T21:32:42.150 に答える