1

我創建了一個combobox並將observable集合設置爲itemsource,並在observable集合項上實現了INotifyPropertyChanged。即使在那之後,當我在組合框中選擇不同的項目時,不會調用OnPropertyChange方法。我認爲我沒有正確地進行綁定。任何人都可以在這方面糾正我/建議我。未提高Combobox INotifyPropertyChanged事件!

--------------------------------- MainPage.xaml ---------- -----------------------------------------

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="MasterDetailsUpdate.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> 

    <StackPanel Width="300"> 

      <ComboBox Name="cboName"></ComboBox> 

      <TextBox Name="tbxName" Text="{Binding Path=name,Mode=TwoWay,ElementName=cboName}" ></TextBox> 


    </StackPanel> 

</UserControl> 

- ------------------------- MainPage.xaml.cs中-------------------- ---------------------------

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.ComponentModel; 

namespace MasterDetailsUpdate 
{ 

    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
      Loaded += new RoutedEventHandler(MainPage_Loaded); 
     } 

     void MainPage_Loaded(object sender, RoutedEventArgs e) 
     { 
      ObservableCollection<Person> persons = new ObservableCollection<Person>(); 
      persons.Add(new Person { city = "c1", name = "n1" }); 
      persons.Add(new Person { city = "c2", name = "n2" }); 
      persons.Add(new Person { city = "c3", name = "" }); 
      persons.Add(new Person { city = "c4", name = "" }); 
      persons.Add(new Person { city = "c5", name = "n1" }); 

      cboName.ItemsSource = persons; 
      cboName.DisplayMemberPath = "name"; 
     }  
    } 

    public class Person : INotifyPropertyChanged 
    { 
     private string _name; 
     private string _city; 
     public string name 
     { 
      set 
      { 
       _name = value; 
       OnPropertyChanged("name"); 
      } 
      get 
      { 
       return _name; 
      } 
     } 


     public string city 
     { 
      set 
      { 
       _city = value; 
       OnPropertyChanged("city"); 
      } 
      get 
      { 
       return _city; 
      } 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     #endregion 
    } 
} 

謝謝

+0

歡迎來到SO,請花幾分鐘的時間閱讀常見問題解答和Markdown文檔(在編輯問題時右邊有一個有用的synposis)。 – AnthonyWJones 2010-05-30 21:03:05

回答

1

不,你沒有約束力的權利, 你的 文本框結合應該是這樣的: -

<TextBox Name="tbxName" Text="{Binding Path=SelectedItem.name, Mode=TwoWay, ElementName=cboName}" /> 

組合框不具有name財產。它確實有一個SelectedItem屬性,它將是當前選定的Person實例。然後您需要該實例的name屬性。因此,您在綁定中需要的路徑是SelectedItem.name

現在您應該發現,當您編輯文本框將焦點移到別處時,PropertyChange事件將觸發,您應該看到組合框中的更改。

默認情況下注意文本框不更新其值,直到用戶按下標籤或以其他方式移動焦點。