1

ComboBoxでバインディングアップデートの問題が発生しています。私のComboBoxのItemSourceは、LaneConfigurationsのリストにバインドされています。ComboBoxのSelectedItemは、コードビハインドのSelectedLaneConfigurationプロパティにバインドされています。各LaneConfigurationの「DisplayID」プロパティを表示するようにComboBoxのItemTemplateを構成しました。

これはほとんどの場合機能します。ただし、レーン構成を変更すると、DisplayIDが変更される可能性があります。特定のレーンを選択し、そのDisplayIDがComboBoxの「Text」として表示されている場合、LaneConfigurationオブジェクトを変更すると、ComboBoxの「Text」部分は表示されるはずの新しい「DisplayID」で更新されません。 。ComboBoxのドロップダウン矢印をクリックすると、リストで選択されたアイテムとして表示されるアイテムに正しいDisplayIDが表示されますが、ComboBoxの上部に表示されている'DisplayID'と一致しません。 ' 分野。

コードビハインドでは、「SelectedLaneConfiguration」プロパティでPropertyChangedイベントを発生させています。'DisplayID'プロパティを更新する必要があることをComboBoxに認識させるにはどうすればよいですか?'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);
          }
       }
   }
4

2 に答える 2

1

私はこれのより短い例を作成し、再投稿して答えを得ました。

コードビハインドで必要なのはINotifyPropertyChangedだけだと思いました。実際には、データオブジェクトのLaneConfigurationクラスでも必要でした。AliAdlのコメントにもっと注意を払うべきだった。それは私に欲求不満の日を救ったでしょう。

役立つ回答をくれたAliAdlとTimに感謝します!!

于 2012-06-15T19:10:49.323 に答える
0

正しい方法は、自動更新で問題が発生しないよりも、bindin-g(DependencyProperty)のプロパティを作成することです。

INotifyPropertyCahgngeを使用する場合は、機能する必要がありますが、機能しない場合は、PropertyChanged event==nullかどうかを確認してください。

于 2012-06-18T06:54:52.147 に答える