سؤال

لقد بحثت في عالية ومنخفضة ولا يمكنني العثور على إجابة على هذا. لدي سؤالان

  1. كيف تقوم بإنشاء صفيف أو مجموعة في XAML. لقد حصلت على صفيف أريد التمسك به وربط مربع التحرير والسرد. كانت فكرتي الأولى هي وضع عنصر عناصر في قاموس الموارد ، ولكن يتوقع أن يكون Selecsource of a Combo Box غير قابلة للتنفيذ حتى لا ينجح ذلك.

إليك ما جربته في قاموس الموارد الخاص بي ولا يعمل

<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 لديه دعم محدود للغاية للأشكال ، لذا ربما تكون قائمة الصفيف هي أفضل ما يمكنني فعله الآن ، لكنني ما زلت أحب المساعدة في السؤال الثاني إذا كان لدى أي شخص Anser

الثاني. لقد حاولت الرجوع إلى قاموس الموارد المدمج في XAML الخاص بي ولديه مشاكل لأنه تحت النافذة. كان لديّ أكثر من مجرد القاموس ، لذلك تطلب مني إضافة X: KEY. بمجرد إضافة المفتاح ، لم يعد بإمكان النظام العثور على العناصر الموجودة في قاموس الموارد الخاص بي. اضطررت إلى نقل القاموس المدمج إلى الشبكة. من الناحية المثالية ، أود الإشارة إلى القاموس المدمج في app.xaml لكن لدي نفس المشكلة

إليك بعض رمز العينة. يتطلب هذا الجزء الأول x: مفتاح التجميع لأن لديّ محول وشكا من أن كل عنصر يجب أن يكون لديه مفتاح إذا كان هناك أكثر من واحد

<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>

شكرًا لك

هل كانت مفيدة؟

المحلول

بقدر ما أفهم مشكلتك ، فأنت تريد ربط combobox (أو مربع قائمة) مع مجموعة من العناصر ، أليس كذلك؟ إذا كنت تريد عناصر من مصدر بيانات خارجي ، فيمكنك فقط استخدام خاصية 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 ممتلكات أي FrameworkElement مثل Window, UserControl, ، أو Application) من النوع ResourceDictionary ليس جمع قواميس الموارد! وانت ايضا لا يمكن تفعل مثل هذا:

<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>

أتمنى أن يساعدك هذا.
يعتبر،
ميهير جوكاني

نصائح أخرى

الرجاء تصحيحني إذا كنت مخطئًا ولكني أعتقد أنك تريد شيئًا كهذا؟

<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}"

بالنسبة للموارد ، تحتاج فقط إلى تحريك المحول الإضافي الخاص بك في موارد الموارد المعلنة حديثًا:

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

    <win:BooleanToVisibilityConverter x:Key="VisibilityConverter" /> 
    </ResourceDictionary> 
</App.Resources> 

إذا قمت بإضافة قاموس الموارد داخل موارد النافذة ، فلن تتمكن من الوصول إليه في كل مكان ، بدلاً من ذلك ، يجب عليك إضافة موارد "التطبيق" (تحقق من ملف App.xaml).

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

سيكون هذا متاحًا في كل كائن WPF بغض النظر عن إنشاء أي تسلسل هرمي للميراث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top