基础ComboBox项目描述更改时,在ComboBox文本字段中绑定不更新

时间:2012-06-14 19:02:26

标签: c# wpf xaml binding wpf-controls

我的ComboBox存在绑定更新问题。我的ComboBox的ItemSource绑定到LaneConfigurations列表。 ComboBox的SelectedItem绑定到我的代码隐藏中的SelectedLaneConfiguration属性。我配置了ComboBox的ItemTemplate以显示每个LaneConfiguration的'DisplayID'属性。

大部分时间都可以使用。但是,更改通道配置可能会导致DisplayID发生变化。如果您选择了特定的通道并且它的DisplayID显示为ComboBox的“文本”,然后您更改了LaneConfiguration对象,则ComboBox的“Text”部分不会使用应显示的新“DisplayID”进行更新。当我单击ComboBox上的下拉箭头时,显示为列表中所选项目的项目显示正确的DisplayID,但这与其中“ComboBox”顶部显示的“DisplayID”不匹配。 'field。

在我的代码中,我在'SelectedLaneConfiguration'属性上触发了一个PropertyChanged事件。如何让ComboBox意识到'DisplayID'属性需要更新?我试图为'DisplayID'属性触发一个PropertyChanged事件,但它是LaneConfiguration类的一部分,所以它似乎没有更新。

我在下面包含了XAML以及显示ComboBox文本显示与ComboBox下拉列表内容不同步的屏幕截图。

ScreenShot

部分XAML:

<ComboBox x:Name="_comboBoxLanes" Height="26"
          ItemsSource="{Binding SensorConfiguration.LaneConfigurations}" 
          SelectedItem="{Binding Path=SelectedLaneConfiguration}">
     <ComboBox.ItemTemplate>
        <DataTemplate>
           <TextBlock Text="{Binding DisplayID, Mode=OneWay}"/>
        </DataTemplate>
     </ComboBox.ItemTemplate>
</ComboBox>

一些代码隐藏:

    public partial class LaneManagement : INotifyPropertyChanged, IDisposable
    {
        ..
        ..

        public event PropertyChangedEventHandler PropertyChanged;

        private void FirePropertyChanged(string prop)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }

        private void SensorConfiguration_Changed()
        {
            LaneTools.ResetLanePolygons();
            GenerateLaneTypeDropdowns();
            FirePropertyChanged("SensorConfiguration");
            FirePropertyChanged("SelectedLaneConfiguration");
            FirePropertyChanged("DisplayID");
        }
   }


   public class LaneConfiguration : PolygonConfiguration
   {
       public override string DisplayID
       {
          get
          {
              return IsLaneGroup?string.Format("Lanes {0} - {1}", ID, ID + LaneCount - 1):                                  string.Format("Lane {0}", ID);
          }
       }
   }

2 个答案:

答案 0 :(得分:0)

我创建了一个较短的例子并重新发布并获得answer

我以为我只需要在代码隐藏中使用INotifyPropertyChanged。我实际上也需要它在我的数据对象LaneConfiguration类中。我应该更加关注Ali Adl的评论。这本来可以让我感到沮丧。

感谢Ali Adl和Tim提供的有用答案!!

答案 1 :(得分:0)

正确的方法是创建绑定的属性 - DependencyProperty - 而不是自动更新没有任何问题。

如果你使用INotifyPropertyCahgnge而不是它必须工作,如果没有 - 检查PropertyChanged event == null。