2010-10-06 50 views
1

我有一個很奇怪的問題。 我有一個數據網格綁定到一個可觀察的類型人物集合 所選項目綁定到一個對象人。 我有2個文本框的名字和姓氏。 當用戶從網格中選擇一個項目時,文本框的值會被填充。 用戶可以編輯這些值並點擊提交按鈕,值得到更新。WPF文本框失去了原始值,即使用戶沒有udpate

源到目標的工作正常 - 即能夠從viewModel顯示 當我更新值得到更新。

讓我們說用戶選擇了名字john,lastname smith 問題是用戶編輯johnny的名字,他沒有單擊提交按鈕,而是他從datagrid中選擇不同的項目,所以當我回到原始選定的項目。在網格中,所選項目顯示爲約翰史密斯,但在文本框中,值顯示爲約翰尼史密斯。

如何解決這個問題?任何幫助將不勝感激。

回答

0

要開始,請將DataGrid中的SelectedItem綁定到ObservableCollection中的項目。然後將TextBox控件綁定到DataGrid中的SelectedItem(在我的例子中爲SelectedCustomer)。然後通過實現INotifyPropertyChanged來更新SelectedCustomer以保持SelectedCustomer的ObservableCollection insync。 最後,您可以在TextBox控件中包含UpdateSourceTrigger = PropertyChanged,以便在需要時在TextBox中鍵入的同時更新DataGrid。

我已經包含下面的代碼(ViewModelBase除外),讓你開始。

這裏是一個DataGrid和兩個文本框控件的XAML:

<Window x:Class="DataGridTextBox.Views.MainView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WpfToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    Title="Main Window" Height="400" Width="800"> 
    <DockPanel> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <WpfToolkit:DataGrid 
      Grid.Column="0" 
      SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}" 
      ItemsSource="{Binding Path=Customers, Mode=OneWay}" > 
     </WpfToolkit:DataGrid> 
     <StackPanel Grid.Column="1"> 
      <TextBlock Text="First Name"/> 
      <TextBox Text="{Binding Path=SelectedCustomer.FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      <TextBlock Text="Last Name"/> 
      <TextBox Text="{Binding Path=SelectedCustomer.LastName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
     </StackPanel> 
    </Grid> 
    </DockPanel> 
</Window> 

下面是一個簡單的視圖模型:

public class MainViewModel : ViewModelBase 
{ 

    public MainViewModel() 
    { 
    _customers = Customer.GetSampleCustomerList(); 
    _selectedCustomer = _customers[0]; 
    } 

    private ObservableCollection<Customer> _customers = null; 
    public ObservableCollection<Customer> Customers 
    { 
    get 
    { 
     return _customers; 
    } 
    } 

    private Customer _selectedCustomer; 
    public Customer SelectedCustomer 
    { 
    get 
    { 
     return _selectedCustomer; 
    } 
    set 
    { 
     _selectedCustomer = value; 
     OnPropertyChanged("SelectedCustomer"); 
    } 
    } 
} 

有關示例代碼,我剛纔設置的DataContext的查看到視圖模型這裏:

public partial class App : Application 
{ 
    private void OnStartup(object sender, StartupEventArgs e) 
    { 
    // Create the ViewModel and expose it using the View's DataContext 
    Views.MainView view = new Views.MainView(); 
    view.DataContext = new ViewModels.MainViewModel(); 
    view.Show(); 
    } 
} 

最後一個簡單的客戶定義:

public class Customer 
{ 
    public String FirstName { get; set; } 
    public String MiddleName { get; set; } 
    public String LastName { get; set; } 
    public String Address { get; set; } 
    public Boolean IsNew { get; set; } 

    // A null value for IsSubscribed can indicate 
    // "no preference" or "no response". 
    public Boolean? IsSubscribed { get; set; } 

    public Customer(String firstName, String lastName, 
     String address, Boolean isNew, Boolean? isSubscribed) 
    { 
    this.FirstName = firstName; 
    this.MiddleName = lastName; 
    this.LastName = lastName; 
    this.Address = address; 
    this.IsNew = isNew; 
    this.IsSubscribed = isSubscribed; 
    } 

    public static ObservableCollection<Customer> GetSampleCustomerList() 
    { 
    return new ObservableCollection<Customer>(new Customer[4] { 
      new Customer("Jeff", "Zero", 
       "12 North Third Street, Apartment 45", 
       false, true), 
      new Customer("Joel", "One", 
       "34 West Fifth Street, Apartment 67", 
       false, false), 
      new Customer("Jon", "Two", 
       "56 East Seventh Street, Apartment 89", 
       true, null), 
      new Customer("Zamboni", "Three", 
       "78 South Ninth Street, Apartment 10", 
       true, true) 
     }); 
    } 
} 
1

謝謝大家。該問題通過使用去激活事件來解決。所以無論何時用戶點擊網格中的新項目,舊項目De_Activating事件將檢查數據是否已從原始數據改變,如果是,則會顯示一條警告消息,供用戶選擇新項目或停留並完成編輯。如果用戶希望停留並完成編輯,則使用e.Cancel = true取消事件;並且活動記錄保留在舊項目中。如果用戶繼續進行新選擇,則舊值將恢復到該對象。

我相信可能有更好的解決方案,我絕對願意學習。謝謝你的努力。對此,我真的非常感激。

相關問題