2011-04-14 21 views
6

Visual Studio 2010'da yeni bir WPF uygulaması kurup şu kodu + XAML eklerseniz, içeride açılan kutularla bir veri kılavuzu açılır. Sorun şu ki, bir combobox aracılığıyla bir değerin değiştirilmesi, ilişkili veri modeline yayılmamaktadır. Diğer bir deyişle: MyValue adlı özellik asla ayarlanmaz. Şimdi saatlerimi aldı ve bunun neden işe yaramadığına dair bir fikrim yok. Ayrıca birçok benzer konu ve öneride bulunmadı.WPF ComboBox'ta DataGrid veri bağlama/güncelleştirme çalışmıyor

İşte XAML. Bu bir DataGrid içeren basit bir penceredir. DataGrid, CellTemplate ve CellEditingTemplate'ın ayarlandığı bir şablon sütununa sahiptir. Her ikisi de kaynak bölümünden liste ile doldurulmuş bir ComboBox içerir. ComboBox.SelectedItem MyItem.MyValue bağlıdır:

<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> 

İşte kodu. Sadece bir DataContext oluşturan ana Window ctor içerir. MyItem, INotifyPropertyChanged öğesini destekleyen satırın veri modelidir. MyItemList, ComboBox.ItemsSource'a bağlı seçeneklerin listesidir.

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"); } 
} 

cevap

10

SelectedItem bağlama güncelleştirmesinin çalışması için PropertyChanged kaynağını yapabilmeniz gerekeceğinden şüpheleniyorum.

SelectedItem = "{Binding Path = MyValue, Mod = TwoWay, UpdateSourceTrigger = PropertyChanged}"

Ben celltemplate yapmak istiyorum ve diğer ortadan kaldırmak için, bu ayıklarken CellEditingTemplate hem düzenleme şablonu referans, ilgisiz, şablon sıraya girene kadar.

+1

Sadece test ettim ve benim için çalıştı. Hem CellTemplate hem de CellEditingTemplate referans şablonunu yaptım ve UpdateSourceTrigger = PropertyChanged ekledim. Bir combobox'ta bir öğe seçtiğimde, MyValue setter çağrılır. Ben VS 4.0 SP1 yüklü .NET 4.0 karşı test ediyorum. –

+0

HEUREKA! Şimdi çalışıyor. Çok teşekkür ederim! – MRoc

+1

Bu neden çalışıyor? Eğer aynı "ComboBox" ı DataGrid'in dışına taşırsam (sadece bir listeye), bu aynı viewmodel için gerekli değildir. –