8

私は高低を検索しましたが、これに対する答えを見つけることができません。2つの質問があります

  1. XAMLで配列またはコレクションをどのように作成しますか。そこに貼り付けてコンボボックスにバインドしたい配列があります。私の最初のアイデアは、ItemsControlをリソースディクショナリに配置することでしたが、コンボボックスのItemsSourceはIEnumerableを想定しているため、機能しませんでした。

これが私のリソース辞書で試したもので、どちらも機能しません

<ItemsControl x:Key="stateList">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</ItemsControl>
<ItemsControl x:Key="stateList2">
    <ComboBoxItem>AL</ComboBoxItem>
    <ComboBoxItem>CA</ComboBoxItem>
    <ComboBoxItem>CN</ComboBoxItem>
</ItemsControl>

これが私がそれにバインドする方法です

<ComboBox SelectedValue="{Binding Path=State}" ItemsSource="{Binding Source={StaticResource stateList2}}"  >

                    </ComboBox>

編集:更新

私はこの最初の部分をこのように機能させました

 <col:ArrayList x:Key="stateList3">
    <sys:String>AL</sys:String>
    <sys:String>CA</sys:String>
    <sys:String>CN</sys:String>
</col:ArrayList>

ただし、配列リストは使用したくないので、汎用リストを使用したいので、誰かがその方法を知っている場合は、私に知らせてください。

更新の編集:XAMLはジェネリックスのサポートが非常に限られていると思うので、配列リストが今のところ最善の方法かもしれませんが、誰かが回答を持っている場合は、2番目の質問についても助けが必要です

2位。XAMLでマージされたリソースディクショナリを参照しようとしましたが、Window.resourcesの下にディクショナリ以外のものがあり、x:Keyを追加する必要があったため、問題が発生しました。キーを追加すると、システムはリソースディクショナリ内のアイテムを見つけることができなくなります。代わりに、マージされた辞書をGrid.Resourcesに移動する必要がありました。理想的には、app.xamlでマージされた辞書を参照したいのですが、同じ問題があります

ここにいくつかのサンプルコードがあります。この最初の部分は、コンバーターがあり、複数のアイテムがある場合はすべてのアイテムにキーが必要であると文句を言ったため、コンパイルにx:keyが必要でした

<UserControl.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

これに変更しなければなりませんでした

<UI:BaseStep.Resources>
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />             
</UI:BaseStep.Resources>
<Grid>
    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourcesD.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Grid.Resources>
</Grid>

ありがとうございました

4

4 に答える 4

19

私があなたの問題を理解している限り、ComboBox(またはListBox)をアイテムの配列にバインドしたいですよね?外部データソースからのアイテムが必要な場合は、便利なDataContextプロパティを利用できます。詳細については、MSDNを検索してください。ただし、手動で収集する必要がある場合は、次のようにしてください。

独自のクラスを作成します。

public class StringCollection : ObservableCollection<string> { }

そして今、次のように使用します:

<Window.Resources>
    <local:StringCollection x:Key="stringCollection">
        <sys:String>Hello</sys:String>
        <sys:String>World</sys:String>
    </local:stringCollection>
</Window.Resources>

...

    <ListBox
        Margin="15"
        ItemsSource="{StaticResource stringCollection}" />

または、より一般的なコレクションが必要な場合は、次のようなクラスを作成します。

public class ObjectCollection : ObservableCollection<object> { }

次のように使用します。

    <local:ObjectCollection x:Key="objectCollection">
        <sys:String>Hello</sys:String>
        <TextBlock>World</TextBlock>
        <sys:Int32>12345</sys:Int32>
    </local:ObjectCollection>

    ...

    <ComboBox
        Margin="15"
        ItemsSource="{StaticResource objectCollection}" />



Int32Collectionまた、を実装する ようないくつかの組み込みクラスを利用することもできますIEnumerable。それらをリソースとして直接使用できます。


Resourcesプロパティ(、、、、など)は、リソースディクショナリのコレクションではなくタイプ です。だからあなたはこのようにすることはできません:FrameworkElementWindowUserControlApplicationResourceDictionary

<UserControl.Resources>

    <!-- The first RD -->
    <!--<ResourceDictionary>
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
    </ResourceDictionary>-->

    <!-- Second RD!!! -->
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

代わりに、次のようにしてください。

<UserControl.Resources>

    <!-- 
        There should be only 1 main RD, 
        Merge other RDs, if any
     -->
    <ResourceDictionary>

        <!-- First Resource -->
        <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />

        <!-- Second Resource -->
        <ResourceDictionary.MergedDictionaries>
            <!-- Now, there can be multiple RDs -->
            <ResourceDictionary Source="/ResourcesA.xaml" />
            <ResourceDictionary Source="/ResourcesB.xaml" />
            <ResourceDictionary Source="/ResourcesC.xaml" />
            <ResourceDictionary Source="/ResourcesD.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

</UserControl.Resources>

お役に立てれば。
よろしく、
ミヒルゴカニ

于 2010-03-19T17:27:22.690 に答える
1

私が間違っていたら訂正してください、でもあなたはこのようなものが欲しいと思いますか?

<Grid.Resources>
  <local:MyCustomCollection x:Key="local:MyCustomCollection"/>
</Brid.Resources>

ウィンドウの上部には、次のプロパティがあります。

xmlns:local="clr-namespace:MyNamespace"

そしてあなたのコードの中にあなたは持っているでしょう:

MyCustomCollection  custCol = MyGrid.Resources["MyCustomCollection"] as MyCustomCollection;

バインドは、次のようなプロパティを持つコントロールで発生します。

ItemsSource="{StaticResource MyCustomCollection}"
于 2010-03-19T16:13:37.643 に答える
1

リソースについては、追加のコンバーターを新しく宣言されたResourceDictionaryに移動する必要があります。

<App.Resources> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 
于 2010-03-19T17:11:46.363 に答える
0

Windowのリソース内にリソースディクショナリを追加すると、どこからでもアクセスできなくなります。代わりに、「App」のリソースを追加する必要があります(App.xamlファイルを確認してください)。

<App.Resources> 
    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
            <ResourceDictionary Source="/ResourcesD.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</App.Resources> 

これは、継承階層の作成に関係なく、すべてのWPFオブジェクトで使用できます。

于 2010-03-19T16:46:52.240 に答える