简体   繁体   English

ComboBox所选项目未更新

[英]ComboBox Selected Item not updating

Problem 问题

I am trying to bind a ComboBox's SelectedItem to a custom class but this does not update when the property is changed. 我试图将ComboBox的SelectedItem绑定到自定义类,但是更改属性后不会更新。 INotifyPropertyChanged is implemented. 实现了INotifyPropertyChanged

The DataContext DataContext

The DataContext is a custom class which contains many properties, but an extract of this is below. DataContext是一个自定义类,其中包含许多属性,但下面是其中的一部分。 You can see it implements INotifyPropertyChanged and this called when the two properties are changed. 您可以看到它实现了INotifyPropertyChanged并且在更改两个属性时调用了此方法。

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;
    }
}

The Window XAML 窗口XAML

I have several controls on the window, but to keep the code simple I believe the following extract will suffice. 我在窗口上有几个控件,但是为了使代码简单,我相信下面的摘录就足够了。

<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>

The above extract contains: 上面的摘录包含:

  • A Label that contains a contact's name, and a button to search for a contact, bound to the FullName of the Engineer 一个Label包含联系人的姓名,以及一键查找联系人,势必在FullName中的Engineer
  • A ComboBox that contains departments within the company, bound to an ObservableCollection<DOSets> , which contains a list of departments 一个ComboBox ,其中包含公司内与部门ObservableCollection<DOSets>绑定的部门,该部门包含部门列表
  • Two ComboBox es, one which is a custom one and the other which is temporary to ensure the bug is not within the control. 两个ComboBox es,一个是自定义的,另一个是临时的,以确保错误不在控件内。 These are Databound to LeadingSet 这些数据LeadingSetLeadingSet

Window Code Behind 背后的窗口代码

In the code behind I set the DataContext to CurrentChange . 在后面的代码中,我将DataContext设置为CurrentChange When the user wants to select a different Engineer then this will update the selected department for the engineer in CurrentChange . 当用户想要选择其他Engineer这将在CurrentChange为工程师更新所选部门。

When the user changes the engineer, the data binding for the engineer is updated, but the selected department (Leading Set) isn't. 当用户更换工程师时,工程师的数据绑定将更新,但所选部门(领导集)则不会更新。

//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));
        }
    }
}

我已经意识到问题可能是由于LeadingSet所致,该LeadingSet是在更换工程师时返回的,与ObservableCollection中的实例不同。

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

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