2016-10-05 22 views
0

問題

を更新していない私は、コンボボックスのSelectedItemカスタムクラスをバインドしようとしていますが、プロパティが変更されたとき、これは更新されません。 INotifyPropertyChangedが実装されています。ComboBoxの選択項目

のDataContext

DataContextは、多くのプロパティが含まれているカスタムクラスですが、この抽出物は以下の通りです。 INotifyPropertyChangedが実装されていますが、これは2つのプロパティが変更されたときに呼び出されます。

public class BctsChange : INotifyPropertyChanged 
{ 
    #region declarations 
    private byContact _Engineer; 

    public byContact Engineer 
    { 
     get { return _Engineer; } 
     set 
     { 
      _Engineer = value; 
      NotifyPropertyChanged("Engineer"); 
      OnEngineerChanged(); 
     } 
    } 

    private BctsSvc.DOSets _LeadingSet; 

    public BctsSvc.DOSets LeadingSet 
    { 
     get { return _LeadingSet; } 
     set { _LeadingSet = value; NotifyPropertyChanged("LeadingSet"); } 
    } 
    #endregion 

    #region INotify 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 

    public BctsChange() 
    { 
     Engineer = new byContact(Environment.UserName); 
    } 

    private void OnEngineerChanged() 
    { 
     if (Engineer != null) 
     { 
      BctsSvc.DOSets leadSet = GetLeadingSetFromDeptCode(Engineer.DeptCode); 

      if (leadSet == null) return; 
      LeadingSet = leadSet; 
     } 
    } 


    private static BctsSvc.DOSets GetLeadingSetFromDeptCode(string DeptCode) 
    { 
     BctsSvc.BctsServiceSoapClient svc = new BctsSvc.BctsServiceSoapClient(); 
     BctsSvc.DOSets setX = svc.GetSetFromDeptCode(DeptCode); 
     return setX; 
    } 
} 

ウィンドウXAML

私はウィンドウ上のいくつかのコントロールを持っているが、私は以下の抽出物は十分であろうと信じて、簡単なコードを維持します。

<Window x:Class="MyNamespace.wdSubmit" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:my="clr-namespace:MyNamespace" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      x:Name="ucReqForm" 
     Title="wdSubmit" > 
    <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">   
     <GroupBox Header="Engineer Details" Name="grpOwnerDetails" > 
      <StackPanel Orientation="Vertical"> 
       <Grid VerticalAlignment="Top"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*"/> 
         <ColumnDefinition Width="35"/> 
        </Grid.ColumnDefinitions> 
        <Label Content="{Binding Engineer.FullName, FallbackValue='Please select an engineer by clicking →', Mode=OneWay}" Margin="5,0" IsEnabled="True" FontStyle="Italic" /> 
        <Button Content="{StaticResource icoSearch}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Height="23" Name="btnSelectEngineer" Margin="0,0,5,0" HorizontalAlignment="Stretch" ToolTip="Search for an engineer responsible" Click="btnSelectEngineer_Click" /> 
       </Grid> 

       <ComboBox Height="23" x:Name="ddSet2" Margin="5,0" ItemsSource="{Binding LeadingSets, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" SelectedItem="{Binding LeadingSet, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}" > 
        <ComboBox.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding SetName}" ToolTip="{Binding HelpInfo}"/> 
         </DataTemplate> 
        </ComboBox.ItemTemplate> 
       </ComboBox> 
       <my:LabelledDropdown Height="23" x:Name="ddSet" Margin="5,0" ItemsSource="{Binding LeadingSets, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" SelectedItem="{Binding LeadingSet, Mode=TwoWay,NotifyOnTargetUpdated=True,NotifyOnSourceUpdated=True}" Label="e.g. BodyHardware"> 
        <my:LabelledDropdown.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding SetName}" ToolTip="{Binding HelpInfo}"/> 
         </DataTemplate> 
        </my:LabelledDropdown.ItemTemplate> 
       </my:LabelledDropdown> 
      </StackPanel> 
     </GroupBox> 
    </StackPanel> 
</Window> 

上記の抽出物が含まれています

  • 連絡先の名前が含まれているLabel、およびボタンを連絡先を検索するために、部門が含まれていEngineer
  • ComboBoxFullNameにバインド会社内では、ObservableCollection<DOSets>にバインドされています。これには、部門リストが含まれています。
  • 2つのComboBox esバグがコントロール内にないことを保証するための一時的なものです。これらは私がCurrentChangeへのDataContextを設定するコードビハインドで

    の後ろLeadingSet

ウィンドウコードにデータバインドされています。ユーザーが別のEngineerを選択したい場合は、エンジニアの選択部門がCurrentChangeに更新されます。

ユーザーがエンジニアを変更すると、エンジニアのデータバインディングが更新されますが、選択した部門(リーディングセット)は更新されません。エンジニアが変更されたとき

私は問題がLeadingSetが原因である可能性が実現しました
//Usings here 

namespace MyNamespace 
{ 
    public partial class wdSubmit : Window, INotifyPropertyChanged 
    { 
     private BctsSvc.BctsServiceSoapClient svc; 

     private BctsChange _CurrentChange; 

     public BctsChange CurrentChange 
     { 
      get { return _CurrentChange; } 
      set { _CurrentChange = value; OnPropertyChanged("CurrentChange"); } 
     } 


     private List<BctsSvc.DOSets> _LeadingSets; 
     public List<BctsSvc.DOSets> LeadingSets 
     { 
      get 
      { 
       return _LeadingSets; 
      } 
     } 


     public wdSubmit() 
     { 
      InitializeComponent(); 
      svc = new BctsSvc.BctsServiceSoapClient(); 
      _LeadingSets = svc.GetLeadSets().ToList(); 
      OnPropertyChanged("LeadingSets"); 

      this._CurrentChange = new BctsChange(); 

      this.DataContext = CurrentChange; 

      CurrentChange.PropertyChanged += new PropertyChangedEventHandler(CurrentChange_PropertyChanged); 
     } 

     void CurrentChange_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      OnPropertyChanged("CurrentChange"); 
      OnPropertyChanged(e.PropertyName); 
     } 

     private void btnSelectEngineer_Click(object sender, RoutedEventArgs e) 
     { 
      byContact newContact = new frmSearchEngineer().ShowSearch(); 

      if (newContact != null) 
      { 
       CurrentChange.Engineer = newContact; 
       PropertyChanged(CurrentChange, new PropertyChangedEventArgs("LeadingSet")); 
       PropertyChanged(CurrentChange.LeadingSet, new PropertyChangedEventArgs("LeadingSet")); 

      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(CurrentChange, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

答えて

0

は、ObservableCollectionのものと異なるインスタンスであること、返されました。

+0

私はこれが答えだとは思わない。しかし、あなたはこれを試すことができます: 'LeadingSet = LeadingSets.Where(x => x.Property == leadSet.Property).FirstOrDefault();' – Pikoh

+0

あなたのコンボボックスのプロパティに 'IsSynchronizedWithCurrentItem =" True " – Mischo5500

関連する問題