2011-04-14 23 views
6

यदि मैं विजुअल स्टूडियो 2010 में एक नया डब्ल्यूपीएफ एप्लीकेशन स्थापित करता हूं और निम्न कोड + एक्सएएमएल जोड़ता हूं, तो डेटा ग्रिड अंदर comboboxes के साथ खुलता है। समस्या यह है कि एक combobox के माध्यम से एक मूल्य बदलना बाध्य डेटा मॉडल के लिए प्रचारित नहीं है। दूसरे शब्दों में: MyValue नाम की संपत्ति कभी भी सेट नहीं हो जाती है। मुझे अब घंटों लगे और मुझे कोई सुराग नहीं है कि यह क्यों काम नहीं करता है। इसके अलावा कई समान धागे और सुझाव नहीं थे।डेटाग्रिड डाटाबेसिंग में अपडेट डब्ल्यूपीएफ कॉम्बोबॉक्स/अपडेट नहीं कर रहा

यहां एक्सएएमएल। यह डेटाग्रिड के साथ बस एक साधारण खिड़की है। डेटाग्रिड में एक टेम्पलेट कॉलम है जहां सेल टेम्पलेट और सेल एडिटिंग टेम्पलेट सेट हैं। दोनों में एक कॉम्बोबॉक्स होता है जो संसाधन अनुभाग से सूची से भरा होता है। कोड यहाँ

<Window x:Class="DataGridComboBoxExample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" xmlns:local="clr-namespace:DataGridComboBoxExample"> 

    <Window.Resources> 

     <local:MyItemList x:Key="ItemList"/> 

     <DataTemplate x:Key="NotificationModeDataTemplate"> 
      <ComboBox 
       ItemsSource="{StaticResource ItemList}" 
       SelectedItem="{Binding Path=MyValue, Mode=OneWay}" /> 
     </DataTemplate> 
     <DataTemplate x:Key="NotificationModeEditTemplate"> 
      <ComboBox 
       ItemsSource="{StaticResource ItemList}" 
       SelectedItem="{Binding Path=MyValue, Mode=TwoWay}" /> 
     </DataTemplate> 

    </Window.Resources> 

    <Grid> 
     <DataGrid x:Name="myDataGrid" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn 
        Header="Test" Width="100" 
        CellTemplate="{StaticResource NotificationModeDataTemplate}" 
        CellEditingTemplate="{StaticResource NotificationModeEditTemplate}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

: ComboBox.SelectedItem MyItem.MyValue के लिए बाध्य है। इसमें मुख्य विंडो सीटीओआर है जो सिर्फ डेटा कॉन्टेक्स्ट सेट करता है। MyItem पंक्ति का डेटामैडल है IOTifyPropertyChanged का समर्थन करता है। MyItemList ComboBox.ItemsSource से जुड़े विकल्पों की सूची है।

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     myDataGrid.ItemsSource = new List<MyItem> 
     { 
      new MyItem { MyValue = "i0" }, 
      new MyItem { MyValue = "i1" }, 
      new MyItem { MyValue = "i0" }, 
     }; 
    } 
} 

public class MyItem : INotifyPropertyChanged 
{ 
    public string MyValue 
    { 
     get { return myValue; } 
     set 
     { 
      myValue = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("MyValue")); 
      } 
     } 
    } 
    private string myValue; 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class MyItemList : List<string> 
{ 
    public MyItemList() { Add("i0"); Add("i1"); Add("i2"); } 
} 

उत्तर

10

मैं तुम्हें इस काम करने के लिए SelectedItem बाध्यकारी अद्यतन PropertyChanged पर स्रोत बनाने की आवश्यकता होगी संदेह है।

SelectedItem = "{बाइंडिंग पथ = MyValue, मोड = TwoWay, UpdateSourceTrigger = PropertyChanged}"

मैं CellTemplate बनाने चाहते हैं और CellEditingTemplate दोनों को संदर्भित अपने संपादित टेम्पलेट जबकि इस डीबगिंग, अन्य को खत्म करने, अप्रासंगिक, टेम्पलेट जब तक आप इसे हल नहीं करते हैं।

+1

मैंने अभी इसका परीक्षण किया, और यह मेरे लिए काम किया। मैंने सेल टेम्पलेट और सेल एडिटिंग टेम्पलेट दोनों को संपादन टेम्पलेट का संदर्भ दिया, और UpdateSourceTrigger = PropertyChanged जोड़ा। जब मैं एक combobox में एक आइटम का चयन करता हूं, MyValue सेटर लागू किया जाता है। मैं वीएस 2010 एसपी 1 के साथ .NET 4.0 के खिलाफ परीक्षण कर रहा हूं। –

+0

हेरेका! अब यह काम कर रहा है। आपका बहुत बहुत धन्यवाद! – MRoc

+1

यह वास्तव में क्यों काम करता है? यदि मैं डेटाग्रिड के बाहर एक ही 'कॉम्बोबॉक्स' को स्थानांतरित करता हूं (केवल एक सूची में) यह उसी व्यूमोडेल के लिए आवश्यक नहीं है। –

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