2009-02-26 23 views
15

मैं एक WPF combobox (WPFToolkit Datagrid के अंदर) प्राप्त करने का प्रयास कर रहा हूं, और मुझे सभी टुकड़ों को सही ढंग से गठबंधन करने में समस्या हो रही है। मैं संस्थाओं को LINQ का उपयोग कर रहा हूँ, और मैं एक Linq क्वेरी के परिणामों के लिए समग्र DataContext सेट कर रहा हूं:WPF कॉम्बोबॉक्स स्रोत को अपडेट नहीं कर रहा है


private void LoadDonationGrid() 
{ 
    donationGrid.ItemsSource = from donations in entities.Donation 
        .Include("Family") 
        .Include("PledgeYear") 
        .Include("DonationPurpose") 
       from donationPurposes in entities.DonationPurpose 
       select new { donations, donationPurposes }; 
} 

मैं अपने कोड-पीछे जो बता गया के लिए ItemsSource प्रदान करता है में एक पृष्ठ संपत्ति है:


private IEnumerable donationPurposeList; 
public IEnumerable DonationPurposeList 
{ 
    get 
    { 
     if (donationPurposeList == null) 
     { 
      donationPurposeList = from dp in entities.DonationPurpose 
            select dp; 
     } 
     return donationPurposeList.ToList(); 
    } 
} 

बता गया के लिए XAML इस तरह दिखता है:

<tk:DataGridTemplateColumn Header="Purpose"> 
    <tk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=donations.DonationPurpose.Description, Mode=TwoWay}" /> 
     </DataTemplate> 
    </tk:DataGridTemplateColumn.CellTemplate> 
    <tk:DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox Name="cboDonationPurpose" 
       SelectedValue="{Binding Path=donations.DonationPurposeID, Mode=TwoWay}" 
       ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor},Path=DonationPurposeList}"         
       DisplayMemberPath="Description" 
       SelectedValuePath="DonationPurposeID" 
         /> 
     </DataTemplate> 
    </tk:DataGridTemplateColumn.CellEditingTemplate> 
</tk:DataGridTemplateColumn> 

और सब कुछ सही ढंग से काम करने के लिए, यानी, उपयुक्त मान ComboBox में प्रदर्शित होते हैं, सही बात क अप करने के लिए लगता है ईर फोकस कॉम्बोबॉक्स छोड़ देता है। उस बिंदु पर, प्रदर्शित मूल्य मूल मान पर वापस आ जाता है, न कि नए चुने गए मूल्य पर। मैंने चयनित वैल्यू के बजाय चयनित इटैम का उपयोग करने का प्रयास किया है, लेकिन यह चयनित मूल्य के साथ समाप्त होता है जो कॉम्बोबॉक्स में दिखाई नहीं दे रहा है। मैं थोड़े रहस्यमय हूं: ऐसा लगता है कि इस बिट को काम करना चाहिए।

संपादित 3/2/09: मैं अभी भी इस पर परेशान हूं। मुझे ध्यान रखना चाहिए कि मेरे डेटाग्रिड में, किसी भी साधारण डेटा कॉलम (उदा।, "डेटाग्रिडटेक्स्ट कॉलम") अंतर्निहित डेटा स्रोत को अपडेट करें जैसा आप चाहते थे। लेकिन मेरे किसी भी टेम्पलेट कॉलम ("DataGridTemplateColumn") या कॉम्बोबॉक्स कॉलम ("DataGridComboBoxColumn") पर कोई भी अपडेट काम नहीं करता है: अंतर्निहित डेटा स्रोत कभी अपडेट नहीं होता है। निश्चित रूप से अन्य लोगों ने WPF.Toolkit डेटाग्रिड का उपयोग करने की कोशिश की है और इस परिदृश्य को काम करने के लिए प्राप्त किया है - लेकिन मैंने वहां सभी नमूना कोड को देखा है, और मैं मूल रूप से ऐसा कर रहा हूं जो यह कहता है (मेरे बाधाओं के भीतर समाधान), इसलिए मैं अपने सिर को खरोंच कर रहा हूं क्यों यह काम नहीं कर रहा है।

कोई विचार?

उत्तर

20

मुझे एक ही समस्या थी (जिस पर मैंने निराशा के दिन बिताए थे), और मैंने पाया कि SelectedValuePropertyChanged पर बाध्यकारी UpdateSourceTrigger को बदलना। मुझे नहीं पता क्यों, लेकिन मेरे लिए, डेटासॉर अपडेट नहीं किया जा रहा था जब तक कि मैंने यह परिवर्तन नहीं किया।

<ComboBox 
    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UpdateTypesManager:MainWindow}}, Path=CardinalityTypes}" 
    DisplayMemberPath="CardinalityType" 
    SelectedValue="{Binding CardinalityTypeId, UpdateSourceTrigger=PropertyChanged}" 
    SelectedValuePath="Id" /> 
+0

मेरे पास बिल्कुल वही समस्या थी। घंटों के लिए इस के साथ गड़बड़ कर रहे थे। मैंने बाध्यकारी को दोवे में बदल दिया, अन्य चीजों की पूरी मेजबानी बदलने की कोशिश की। [एमएसडीएन] (http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx) ऐसा लगता है इंगित करता है कि पाठ जैसे मामलों में डिफ़ॉल्ट लॉस्टफोकस पर सेट है। –

+0

असल में, जब मैं टेक्स्टबॉक्स का उपयोग करता हूं तो यह मेरे लिए लॉस्टफोकस के लिए डिफ़ॉल्ट नहीं है। इसे PropertyChanged पर सेट करना हालांकि इसे ठीक करता है। – tcables

+0

उत्कृष्ट !! समेकित चयनित इटैम बाध्यकारी – Adarsha

5

मैं यह काम करने में सक्षम था। लेकिन मैंने चीजों को थोड़ा अलग तरीके से सेट किया।

  1. मैंने व्यू के साथ अनुबंध के रूप में कार्य करने के लिए व्यूमोडेल बनाया है।
  2. मैं संपत्ति

ComboBox.SelectedValue के बजाय ComboBox.SelectedItem संपत्ति के लिए बाध्य कर जब से मैं नहीं जानता था कि क्या आपके डेटा स्रोत था मैं बना अपने ही मूल समस्या अनुकरण करने के लिए: एक combobox बाँध सही ढंग से हो रही एक डब्ल्यूपीएफ डाटाग्रिड के भीतर।

public class RootViewModel 
{ 
    public List<State> USStates { get; set; } 
    public List<Customer> Customers { get; set; } 

    public ViewModel() 
    { 
     Customers = new List<Customer>(); 
     Customers.Add(new Customer() { FirstName = "John", LastName = "Smith", State = new State() { ShortName = "IL" } }); 
     Customers.Add(new Customer() { FirstName = "John", LastName = "Doe", State = new State() { ShortName = "OH" } }); 
     Customers.Add(new Customer() { FirstName = "Sally", LastName = "Smith", State = new State() { ShortName = "IN" } }); 

     USStates = new List<State>(); 
     USStates.Add(new State() { ShortName = "OH" }); 
     USStates.Add(new State() { ShortName = "IL" }); 
     USStates.Add(new State() { ShortName = "IN" }); 
    } 
} 

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public State State { get; set; } 
} 

public class State 
{ 
    public string ShortName { get; set; } 

    public State() 
    { 
     ShortName = string.Empty; 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj is State) 
     { 
      State otherState = obj as State; 
      return ShortName.Equals(otherState.ShortName); 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

आरंभ करने से पहले, मैं अपने ठीक से निर्माण किया RootViewModel का एक उदाहरण होने के लिए मेरी खिड़की के DataContext सेट:

यहाँ मेरी दृश्य मॉडल की संरचना है।

<tk:DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False"> 
      <tk:DataGrid.Columns> 
       <tk:DataGridTemplateColumn Header="State"> 
        <tk:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=State.ShortName, Mode=TwoWay}" /> 
         </DataTemplate> 
        </tk:DataGridTemplateColumn.CellTemplate> 
        <tk:DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <ComboBox 
           x:Name="cboDonationPurpose" 
           SelectedItem="{Binding Path=State, Mode=TwoWay}" 
           ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window},Mode=FindAncestor}, Path=DataContext.USStates}" 
           DisplayMemberPath="ShortName" 
           SelectedValuePath="ShortName" /> 
         </DataTemplate> 
        </tk:DataGridTemplateColumn.CellEditingTemplate> 
       </tk:DataGridTemplateColumn> 
      </tk:DataGrid.Columns> 
     </tk:DataGrid> 

SelectedItem के लिए ठीक से बाध्य करने के लिए मैं यह सुनिश्चित करना है कि मैं हुड के नीचे के बाद से मेरी इकाई पर बराबर विधि ओवरराइड है की जरूरत में, WPF इस पद्धति का उपयोग कर रहा है निर्धारित करने के लिए जो SelectedItem है या नहीं। मुझे लगता है कि यह मूल रूप से शुरुआत से आपकी समस्या थी जिसने आपको चयनित इटैम के बजाय चयनित वैल्यू से जुड़ने का प्रयास किया।

0

आप अपने Xaml में

IsSynchronizedWithCurrentItem = "True" 

जोड़ने की जरूरत है।

यह उतना आसान है जितना कि ...

+2

इसे 'गलत' पर सेट करने से मेरी एक ही समस्या हल हो गई है। –

संबंधित मुद्दे