组合框的INotifyPropertyChanged问题

时间:2013-07-12 09:51:47

标签: c# wpf xaml binding inotifypropertychanged

请参阅下面的我的CustomView窗口

enter image description here

当我从组合框中选择项目时,与该项目关联的客户端应该自动显示在那里。

在Combobox的选择改变事件中,我做到目前为止

private string client 
{
 get
 {
 return ClientText.Text; 
 }
 set
 {
 ClientText.Text = value;
 }
}

 public Harvest_Project projectClass
    {
        set
        {
            ProjectText.Text = value.ToString();
            Harvest_Project proj = (Harvest_Project)ProjectText.Text; // shows error here. casting is not possible. What can I do here?
            this.client = Globals._globalController.harvestManager.getClientEntriesThroughId(proj._client_id)._name;
            PropertyChanged(this, new PropertyChangedEventArgs("client"));
        }
    }

public int project 
{
 get
 {
 return int.Parse(ProjectText.Text); 
 }
 set
 {
 ProjectText.Text = value.ToString(); 
 }
}

private void ProjectComboBoxChanged(object sender, SelectionChangedEventArgs e)
    {
        if (sender is ComboBoxItem)
        {
            ComboBoxItem item = (ComboBoxItem)sender;
        }
    }

在xaml中,我使用了这样的绑定,

<ComboBox x:Name="ProjectText" SelectionChanged="ProjectComboBoxChanged" ItemsSource="{Binding Path=projectList}" SelectedValuePath="_id" DisplayMemberPath="_name"  SelectedItem="{Binding ProjectComboBoxChanged, Mode=OneWayToSource}" Background="Yellow" BorderThickness="0" Width="66"/>

2 个答案:

答案 0 :(得分:0)

在您的事件处理程序ProjectComboBoxChanged(object sender, SelectionChangedEventArgs e)中,发件人的类型为ComboBox而非ComboBoxItem,因此您的if语句始终为false。

e.AddedItems[0]会为您提供所需的ComboBoxItem。确保先检查计数。

此外,如果您只想设置Text,则无需拥有client属性。

答案 1 :(得分:0)

“客户”是一个属性,它应该是公共的。 然后应该在setter中引发PropertyChanged,因此每当你更改客户端时,UI都会知道。

关于组合,SelectedItem应绑定到属性,而不是方法。该财产可能是“客户”,但另一个财产可能更清楚。

在此属性的setter中,您可以自由修复“client”属性的新值。

最后,既然你正在使用selectedItem的绑定,我认为没有理由使用事件selectionChanged。使用绑定或事件,而不是两者。

希望它有所帮助;)