2010-08-11 20 views
6

मुझे एक कॉम्बो बॉक्स कॉलम के मान को संपादित करने का प्रयास करते समय मेरे डेटाग्रिड से एक अमान्यऑपरेशन अपवाद ('Addfer या EditItem लेनदेन के दौरान' DeferRefresh 'की अनुमति नहीं है) प्राप्त कर रहा है। जिन वस्तुओं को मैं दिखा रहा हूं, वे एक ही सूची में एक अन्य आइटम का संदर्भ रखते हैं, इसलिए मैं इसके लिए combobox का उपयोग कर रहा हूं। यह डाटाग्रिड के समान संग्रह के लिए बाध्य है। मेरा आवेदन जिस पर मैं काम कर रहा हूं .NET 3.5 को लक्षित कर रहा हूं, लेकिन मैंने एक उदाहरण दिया है जो डाटाग्रिड में निर्मित होने के बाद .NET 4 में बिल्कुल समान है। डेटाग्रिड में आइटमों के लिए कोड यहां दिया गया है:डब्ल्यूपीएफ डाटाग्रिड कॉम्बोबॉक्स का कारण अमान्यऑपरेशन एक्सेप्शन

public class TestItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private int m_ID; 
    private string m_Name; 
    private int m_OppositeID; 

    public int ID 
    { 
     get { return m_ID; } 
     set 
     { 
      m_ID = value; 
      RaisePropertyChanged("ID"); 
     } 
    } 
    public string Name 
    { 
     get { return m_Name; } 
     set 
     { 
      m_Name = value; 
      RaisePropertyChanged("Name"); 
     } 
    } 
    public int OppositeID 
    { 
     get { return m_OppositeID; } 
     set 
     { 
      m_OppositeID = value; 
      RaisePropertyChanged("OppositeID"); 
     } 
    } 

    public TestItem(int id, string name, int oppID) 
    { 
     ID = id; 
     Name = name; 
     OppositeID = oppID; 
    } 
} 
मेरी XAML

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private ObservableCollection<TestItem> m_Items; 

    public ObservableCollection<TestItem> Items 
    { 
     get { return m_Items; } 
     set 
     { 
      m_Items = value; 
      RaisePropertyChanged("Items"); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 

     Items = new ObservableCollection<TestItem>(); 

     Items.Add(new TestItem(0, "Fixed", 0)); 
     Items.Add(new TestItem(1, "Left Side", 2)); 
     Items.Add(new TestItem(2, "Right Side", 1)); 
    } 
} 

और अंत में:

<Window x:Class="DataGrid_Combo_Test.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"> 
    <Grid> 
     <DataGrid ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False"> 
      <DataGrid.Resources> 
       <Style x:Key="ItemsSourceStyle" TargetType="ComboBox"> 
        <Setter Property="ItemsSource" Value="{Binding Path=DataContext.Items, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> 
       </Style> 
      </DataGrid.Resources> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Path=ID}" Header="ID" Width="*"/> 
       <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" Width="*"/> 
       <DataGridComboBoxColumn Header="Opposite Item" Width="*" DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValueBinding="{Binding Path=OppositeID}" ElementStyle="{StaticResource ItemsSourceStyle}" EditingElementStyle="{StaticResource ItemsSourceStyle}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

आप की पेशकश कर सकते किसी भी सहायता के लिए अग्रिम धन्यवाद

यह मेरी खिड़की में कोड है!

+1

यह कनेक्ट पर रिपोर्ट किए गए मुद्दों से जुड़ा हुआ प्रतीत होता है (https://connect.microsoft.com/VisualStudio/feedback/details/591125/datagrid-exception-on-validation-failure-deferrefresh-is-not-allowed) और एमएसडीएन मंच (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/187b2b8f-d403-4bf3-97ad-7f93b4385cdf/); लेकिन यह अब तक का सबसे सुंदर कामकाज है! –

+0

मुझे यह समस्या थी क्योंकि मैंने गलती से मेरे डेटाग्रिड और DataGridComboBoxColumn को उसी संग्रह में बाध्य कर दिया था। – Maxence

उत्तर

3

मुझे पता चला कि इस समस्या को कैसे ठीक किया जाए।

मैं अपने Window.Resources में इस तरह की एक CollectionViewSource बनाया: CollectionView या DataGridXYZ.Items पर Refersh कॉल करने से पहले

<DataGridComboBoxColumn Header="Opposite Item" Width="*" DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValueBinding="{Binding Path=OppositeID}" ItemsSource="{Binding Source={StaticResource itemSource}}"/> 
2

प्रयास करें निम्न क्रम:

<Window.Resources> 
    <CollectionViewSource x:Key="itemSource" Source="{Binding Path=Items}"/> 
</Window.Resources> 

तो निम्नलिखित करने के लिए मेरे बता गया स्तंभ परिभाषा ही बदल

DataGridX.CommitEdit(); 

DataGridX.CancelEdit(); 

मेरे लिए काम किया।

+0

पोस्ट किया गया कोड समस्या का एक छोटा सा प्रदर्शन था। असली एप्लिकेशन एमवीवीएम का उपयोग करता है और इस दृष्टिकोण का मतलब ईवेंट हैंडलर और ऐसे को जोड़ना होगा। – aalex675

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