كيف أقوم بإصلاح استثناء "الربط ثنائي الاتجاه يتطلب المسار أو XPath" في WPF Datagrids؟

StackOverflow https://stackoverflow.com/questions/9449689

سؤال

الخلفية/السياق لهذا السؤال:لدي تطبيق WPF لسطح المكتب.ويستخدم LINQ إلى SQL للاتصال بقاعدة بيانات SQL الخاصة به، ويعرض بياناته في WPF Datagrids.لقد كان يعمل بشكل جيد إلى حد ما، ولكن الأداء كان يمثل مشكلة لأن LINQ يمكن أن يكون بطيئًا للغاية، لذلك قمت بتبديل عناصر التحكم المنطقية وواجهة المستخدم الخاصة بي بعيدًا عن سياقات قاعدة بيانات LINQ قدر الإمكان، وبدلاً من ذلك قمت بتحميلها في متغيرات محلية تشبه إلى حد كبير كائنات LINQ، التي تعمل على تحسين الأداء بشكل كبير.

المشكلة:بينما أقوم باختبار Datagrids الخاصة بي، أحصل الآن على استثناء جديد "يتطلب الربط ثنائي الاتجاه المسار أو XPath." عندما أحاول تحرير القيمة في عمود (عدد صحيح) معين من Datagrid واحد، على الرغم من أن تحرير أعمدة السلسلة كان يعمل بشكل جيد.لا أفهم لماذا أحصل على هذا، أو ماذا أفعل حيال ذلك.

لذلك نجح الأمر عندما تم تعيين datagrid.datacontext على ارتباط كيان LINQ، ولكنه يعمل تقريبًا فقط عندما تم تعيينه على قائمة كائنات عادية.حاولت تغيير القائمة إلى ObservableCollection، ولكن لم يكن لهذا أي تأثير واضح.

لقد ألقيت نظرة على حوالي عشرة أسئلة مختلفة ذات صلة هنا وفي مواقع أخرى، ولا أرى أي شيء يبدو أنه يساعد.

حاليا لدي:

<DataGrid Margin="12,110,12,0" x:Name="dgDays" ItemsSource="{Binding}" 
                 Height="165" VerticalAlignment="Top" MinHeight="0" 
                 AutoGenerateColumns="False"
                 SelectionChanged="dgDays_SelectionChanged">

...

<DataGrid.Columns>
            <DataGridComboBoxColumn Width="80" Header="Cook" x:Name="_DailyCookCombo" SelectedItemBinding="{Binding sCook}"/>
            <DataGridComboBoxColumn Width="80" Header="Eat" x:Name="_DailyDayCombo" SelectedItemBinding="{Binding sDay}"/>
            <DataGridTextColumn Width="52" Header="Prot" Binding="{Binding Protein}" />
            <DataGridTextColumn Width="52" Header="Carb" Binding="{Binding Carb}" />
            <DataGridTextColumn Width="52" Header="Fat" Binding="{Binding Fat}" />
            <DataGridTextColumn Width="62" Header="Prot %" Binding="{Binding ProteinPercent}" />
            <DataGridTextColumn Width="62" Header="Carb %" Binding="{Binding CarbPercent}" />
            <DataGridTextColumn Width="62" Header="Fat %" Binding="{Binding FatPercent}" />
            <DataGridTextColumn Width="116" Header="non PFW meals" Binding="{Binding NonPFWMeals}" />
            <DataGridTextColumn Width="55" Header="Prot" Binding="{Binding CalcProt}" IsReadOnly="True" />
            <DataGridTextColumn Width="55" Header="Carb" Binding="{Binding CalcCarbs}" IsReadOnly="True" />
            <DataGridTextColumn Width="55" Header="Fat" Binding="{Binding CalcFat}" IsReadOnly="True" />
            <DataGridTextColumn Width="65" Header="KCal" Binding="{Binding CalcKCal}" IsReadOnly="True" />
            <DataGridCheckBoxColumn Width="32" Header="Skip" Binding="{Binding Skip}"  />
            <DataGridTextColumn Width="70" Header="Date" Binding="{Binding sNextDate}" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>

والذي يرتبط بالكود:

dgDays.DataContext = TheMember.RAM_Member_Requirements_Days;

والتي يتم تعريفها على النحو التالي:

public ObservableCollection<RAM_Member_Requirements_Day> RAM_Member_Requirements_Days = new ObservableCollection<RAM_Member_Requirements_Day>();

وأعضاؤها المقيدين هم:

    public class RAM_Member_Requirements_Day : INotifyPropertyChanged
{
    // RAM equivalents of DB values:
public System.Nullable<decimal> Protein;
public System.Nullable<decimal> Carb;
public System.Nullable<decimal> Fat;
public System.Nullable<decimal> ProteinPercent;
public System.Nullable<decimal> CarbPercent;
public System.Nullable<decimal> FatPercent;
public System.Nullable<int> NonPFWMeals;
public System.Nullable<bool> Skip;
public System.Nullable<System.DateTime> SkipDate;

لقد عثرت على حل بسيط للغاية بعد وقت قصير من كتابة هذا، وسأقوم بنشره عندما يسمح لي الموقع بذلك بعد تأخير قدره 8 ساعات.

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

المحلول 3

حسنًا، بعد أن كتبت كل ذلك، جربت شيئًا نجح.أنا أنشر على أي حال، في حال كان ذلك يساعد الآخرين.

كان الحل هو إضافة متغيرات الأعضاء المشكلة المرتبطة:

{ يحصل؛تعيين؛}

كما في:

    public System.Nullable<decimal> Protein { get; set; }
    public System.Nullable<decimal> Carb { get; set; }
    public System.Nullable<decimal> Fat { get; set; }
    public System.Nullable<decimal> ProteinPercent { get; set; }
    public System.Nullable<decimal> CarbPercent { get; set; }
    public System.Nullable<decimal> FatPercent { get; set; }
    public System.Nullable<int> NonPFWMeals { get; set; }
    public System.Nullable<bool> Skip { get; set; }

نصائح أخرى

لقد واجهت هذه المشكلة مع مربع نص منضم.كان الحل الخاص بي هو الارتباط بشكل صريح بـ ".":

<TextBox Text="{Binding Path=.}" />

لقد فعلت هذه الحيلة.

يمكن أن يحدث خطأ "الربط ثنائي الاتجاه يتطلب مسارًا أو XPath" بسبب اختلاف بسيط في اسم المسار في XAML مقابل المسار الموجود في عنصر الربط c#.الحروف الكبيرة مهمة حقًا!كانت تلك مشكلتي.

XAML:

<DataGridTextColumn Binding="{Binding Path=TotalHeure}"   ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/>

ج#:

public string Totalheure { get; set; }

سيؤدي هذا إلى ربط ثنائي الاتجاه يتطلب خطأ المسار أو XPath لأنهما ليسا متماثلين تمامًا ولا تتمكن البرامج من العثور على مسار الربط!

ربما سيساعد شخصًا آخر ارتكب نفس الخطأ

يمكن للمرء أحيانًا أن يفعل شيئًا صغيرًا غريبًا عندما يشعر بالتعب في نهاية اليوم.لدي ربط Datagrid بكيان إطاري للكيان يسمى المعال - الحقول Name_of_Dependant / Relationship / Date_of_Birth.بطريقة ما قررت إنشاء خصائص جديدة:الأسماء الكاملة / العلاقة / تاريخ الميلاد - جميع الأنواع الصحيحة.
لذلك في شبكة البيانات الخاصة بي أقوم بالربط بـ

ObservableCollection<Dependant> 

ولكن يجب أن ترتبط أعمدتي بعد ذلك بالأعمدة الموجودة في جدول الكيان التابع لدي.لذلك هذا هو الصحيح:

Binding="{Binding Name_of_Dependant}"

وكان هذا خطأ:

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