سؤال

مرحبًا يا من هناك! إليك سؤالي:

لدي DataGrid في WPF ولدي عمود أولى هو DataGridComboBoxColumn.

ما أرغب في القيام به هو أن يكون له رأس لهذا العمود أيضا مع COMBOBOX: تغيير الرأس بنشره طوال العمود.

يمكنني القيام بذلك بصريا، ولكن عندما أقدم البيانات، لا يحمل القائمة المرتبطة مع DataGrid قيم Combobox الجديدة.

<dg:DataGridComboBoxColumn SelectedItemBinding="{Binding BIBStatus}"                                            
                           ItemsSource="{Binding Source={StaticResource typeStatus}}" 
                           Width="0.20*">
                    <dg:DataGridComboBoxColumn.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="Built-In Bridge"/>
                                <ComboBox SelectedItem="{Binding BIBStatus}" 
                                          SelectionChanged="ComboBox_SelectionChanged"
                                          ItemsSource="{Binding Source={StaticResource typeStatus}}"/>
                            </StackPanel>                                
                        </DataTemplate>
                    </dg:DataGridComboBoxColumn.HeaderTemplate>
                </dg:DataGridComboBoxColumn>

في combobox_SelectionChanged لدي التعليمات البرمجية التالية:

DataGridColumn comboCol = this.gridResults.Columns[0];

        for (int i = 0; i < this.gridResults.Items.Count; i++)
        {
            ComboBox myCmBox = (comboCol.GetCellContent(this.gridResults.Items[i]) as ComboBox);

            myCmBox.SelectedValue = ((ComboBox)sender).SelectedValue;
        }

عندما أقدم البيانات، أرسل القائمة التي هي DataContext إلى DataGrid؛ إذا قمت بتغيير قيمة العمود الأول الذي يعالج صف في المرة الواحدة، أي النقر فوق الخلية باستخدام combobox في كل صف، يتم نشر القيم إلى القائمة في DataContext، ولكن إذا قمت بتغيير قيمة العمود الأول بواسطة الرأس لم يحدث ذلك.

هل يمكن لأحد أن يقول لي ما أفتقده؟ أنا أظن أنه بالطريقة التي تؤثر على كل صف، لكنني جربت selectvalue، selectedItem و shreadIndex ... كل شيء دون جدوى.

شكرا لك مقدما...

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

المحلول

أعتقد أنني ربما حلها ... أو على الأقل متنكره ...

DataGridColumn comboCol = this.gridResults.Columns[0];

        for (int i = 0; i < this.gridResults.Items.Count; i++)
        {
            ComboBox myCmBox = (comboCol.GetCellContent(this.gridResults.Items[i]) as ComboBox);
            myCmBox.SelectedItem = ((ComboBox)sender).SelectedItem;
        }

        if (this._results != null)
        {
            foreach (Device device in _results)
            {
                device.BIBStatus = (TypeStatus)Enum.ToObject(typeof(TypeStatus), ((ComboBox)sender).SelectedValue);
            }
        }

حاولت تغيير فقط DataContext وآمل في ربط الاتجاهين بالعمل، لكنه فعلت فقط عندما ركزت على كل خلاصة كل صف. لذلك اعتقدت: "لماذا ليس كلا الاتجاهين؟" كما ترون، أقوم بتغيير كل من SELECTITEM كل من Combobox ووضع مريض كل جهاز (الجزء DataContext). بهذه الطريقة أحصل على التأثير المطلوب.

ومع ذلك، لا أعتقد أن هذا الحل هو أفضل واحد وما زلت آمل أن تكون هناك طريقة يمكنني القيام بذلك دون أن تكون منديل.

أي اقتراحات لا تزال موضع ترحيب!

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