繁体   English   中英

C#WPF - ComboBox,值更改但SelectedItem没有

[英]C# WPF - ComboBox, Values change but SelectedItem not

我知道有很多关于SelectedItem和ComboBox的问题,但似乎它们没有解决我的问题。

我有一个ComboBox,我绑定了View Models的ObservableCollection和一个TextBox,它绑定到单个View模型的描述。 我想在这里更改条目...当我使用文本框时,一切正常,项目将在ComboBox中更改(甚至是选定的一个),但是当我更改代码中的文本后面只有ComboBox列表将要更新但不是当前选定的值/项目。

我的ComboBox目前看起来像这样:

<ComboBox ItemsSource="{Binding Sports, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding SelectedSport, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" Width="365" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Height="30" Margin="5 5 5 5">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

使用过的ViewModel如下所示:

public class SportViewModel : ViewModelBase
{
    private ObservableCollection<DisciplineViewModel> _disciplinesProperty;

    public Sport Model
    {
        get;
        set;
    }

    public string Description
    {
        get { return Model.Description; }
        set
        {
            if (Model.Description != value)
            {
               Model.Description = value;
               RaisePropertyChanged(() => Description);
            }
        }
    }

    public ObservableCollection<DisciplineViewModel> Disciplines
    {
        get { return _disciplinesProperty; }
        set
        {
            if (_disciplinesProperty != value)
            {
                _disciplinesProperty = value;
                RaisePropertyChanged(() => Disciplines);
            }
        }
    }

    public SportViewModel(Sport source)
    {
       Model = source;
       Disciplines = new ObservableCollection<DisciplineViewModel>();
       foreach(Discipline d in Model.Disciplines)
       {
           Disciplines.Add(new DisciplineViewModel(d, this));
       }
   }

   public override bool Equals(object obj)
   {
       if (obj == null || !(obj is SportViewModel))
           return false;

      return ((SportViewModel)obj).Description == this.Description;
   }

   public override int GetHashCode()
   {
      return base.GetHashCode();
   }
}

并在这里使用:

class EditSportsDialogViewModel : ViewModelBase
{
  ...
  public ObservableCollection<SportViewModel> Sports 
  {
      get { return _sportsProperty; }
      set
      {
          if (_sportsProperty != value)
          {
              _sportsProperty = value;
          }
      } 
  }

  public SportViewModel SelectedSport
  {
      get { return _selectedSportPorperty; }
      set
      {
          if (_selectedSportPorperty != value)
          {
              if (value != null)
              {
                  Disciplines = value.Disciplines;
              }
              _selectedSportPorperty = value;
              RaisePropertyChanged(() => SelectedSport);
          }
      }
  }

  private void SportRevertExecuted()
  {
      if (SelectedSport != null)
      {
          _context.Entry(SelectedSport.Model).Reload();
      }
      RaisePropertyChanged(() => SelectedSport.Description);
      RaisePropertyChanged(() => SelectedSport);
      RaisePropertyChanged(() => Sports);
      RaisePropertyChanged();
  }
}

一个TextBox也改变了描述,它工作得很好

<TextBox Text="{Binding SelectedSport.Description, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" TextAlignment="Center" Margin="5" Width="410"/>

但是当我调用SportRevertExecuted()只会更改ComboBox列表中的项目,但不会更改当前所选项目的“文本”。 也许有人可以帮助我,我已经尝试了很多,直到现在,似乎没有任何帮助。

好的问题解决了。 是非常愚蠢的RaisePropertyChanged(() => SelectedSport.Description); 不像我想的那样奏效。 我在UpdateView()引入了一个Method UpdateView() ,它在右边的Object中引发了PropertyChanged事件,现在一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM