【问题标题】:WPF - Comboboxes doesn't render in a listview (only the first one)WPF - 组合框不在列表视图中呈现(仅第一个)
【发布时间】:2015-09-08 02:44:48
【问题描述】:

我有一个 WPF MVVM 应用程序,但我遇到了这个问题... 我有一个列表视图,每列有几个文本框和 2 个组合框。 除了连击之外,一切都很好。 组合填充并包含值并仅显示所选值 第一个组合(在列表视图的第一行)。 我尝试了一个小测试,并用文本框切换了组合框,没有问题,所以我想这是组合特有的东西。 请帮我解决这个问题。

XAML:

<ListView DockPanel.Dock="Top" ItemsSource="{Binding NAPS_AgencyCodes}" SelectedItem="{Binding CurrentAgencyCode}"  MaxHeight="650" Margin="10 0" HorizontalAlignment="Left" ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderThickness="1" behave:ListBoxBehavior.ScrollOnNewItem="true">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Code" Width="80">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=Code, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}"  MaxLength="4" FontSize="12" Margin="0 5 0 0" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Description" Width="300">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=Description, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontSize="12" Margin="0 5 0 0" MaxLength="100" Width="285" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="State" Width="250">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding States}" DisplayMemberPath="StateName" SelectedValuePath="ID"  SelectedValue="{Binding Path=StateCode, Mode=TwoWay, UpdateSourceTrigger = PropertyChanged}" Margin="0 5 0 0" Width="235"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="Type Code" Width="250">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding AgencyTypeCodes}" DisplayMemberPath="Description" SelectedValuePath="Code" SelectedValue="{Binding Path=AgencyTypeCode, Mode=TwoWay, UpdateSourceTrigger = PropertyChanged}" Margin="0 5 0 0" Width="235"/>                                
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

查看模型:

private NAPS_AgencyCode _agencyCode;
        private NAPS_AgencyCodeValidator _validator;
        public event Func<string> OnCodeChanged;
        public ObservableCollection<AIR_StateViewModel> States { get; set; }
        public ObservableCollection<NAPS_AgencyTypeCodeViewModel> AgencyTypeCodes { get; set; }        

        private int iCodeSerch;

        #endregion

        #region Ctor

        public NAPS_AgencyCodeViewModel(NAPS_AgencyCode agencyCode)
        {
            _agencyCode = agencyCode;
            _validator = new NAPS_AgencyCodeValidator(this);
        }

        #endregion

        #region Properties

        public string ID
        {
            get { return _agencyCode.ID;  }
            set { _agencyCode.ID = value; }
        }


        public string Code
        {
            get { return _agencyCode.Code; }
            set
            {
                if (_agencyCode.Code == value)
                    return;
                _agencyCode.Code = value;
                SetStatus();
                OnPropertyChanged("Code");              
            }
        }

        public string AgencyTypeCode
        {
            get { return _agencyCode.AgencyTypeCode; }
            set
            {
                if(_agencyCode.AgencyTypeCode == value)
                    return;
                _agencyCode.AgencyTypeCode = value;                
                SetStatus();
                OnPropertyChanged("AgencyTypeCode");                
            }
        }

        public int StateCode
        {
            get { return _agencyCode.StateCode; }
            set
            {
                if (value == _agencyCode.StateCode)
                    return;
                _agencyCode.StateCode = value;
                SetStatus();
                OnPropertyChanged("StateCode");
            }
        }

        public string Description
        {
            get { return _agencyCode.Description; }
            set
            {
                if (value == _agencyCode.Description)
                    return;
                _agencyCode.Description = value;
                SetStatus();
                OnPropertyChanged("Description");                
            }
        }

        public bool IsValid
        {
            get { return _agencyCode.IsValid; }
            set
            {
                if (value == _agencyCode.IsValid)
                    return;
                _agencyCode.IsValid = value;
                OnPropertyChanged("IsValid");
            }
        }

我有一个主视图模型

NAPS_AgencyCodes = Repository.NAPS_AgencyCodeRepository.NAPS_AgencyCodes
                            .ToObservableCollection<NAPS_AgencyCodeViewModel>(); 

非常感谢!

【问题讨论】:

  • 没有看到你的实际代码,我们只能假设事情。这听起来像是您将组合定义为静态资源,然后尝试多次重用该资源。但是 Visuals 只能有一个父级。介意与我们分享您的代码吗?
  • 对不起,你说得对,我添加了一些代码。
  • Mmmmh... 我看不出您的代码有什么问题。您是否尝试过使用像 Snoop 这样的工具来检查正在渲染的内容?检查组合框是否确实存在,它们是否被某些东西覆盖,以及它们的可见性、宽度/高度等。
  • 发布的代码是否有效。 “对不起,你是对的”是否意味着它是一个静态资源,现在它正在工作?如果是这样,请删除问题。
  • 不,它不工作...加载时,所有组合都已填充,只有列表视图第一行的组合显示所选值。

标签: wpf listview mvvm combobox


【解决方案1】:

好的,我发现了我的问题... 我以这种方式填充了组合的集合: 在构造函数中,我只将 2 个集合填充到 this.AgencyTypeCodes 和 this.AirStates 中,然后我以这种方式复制了日期:

_NAPS_AgencyCodes = (from n in _dal.GetItems()
                                select new NAPS_AgencyCodeViewModel(n)
                        {
                            ObjectStatus = Status.NoChange,
                            AgencyTypeCodes = this.AgencyTypeCodes,
                            States =this.AirStates,                            
                        }
                      ).ToObservableCollection<NAPS_AgencyCodeViewModel>();      

解决方案是给每个组合新的集合,这样他们就不会像这样指向其他集合:

_NAPS_AgencyCodes = (from n in _dal.GetItems()
                                select new NAPS_AgencyCodeViewModel(n)
                        {
                            ObjectStatus = Status.NoChange,
                            AgencyTypeCodes = new ObservableCollection<NAPS_AgencyTypeCodeViewModel>(this.AgencyTypeCodes),
                            States = new ObservableCollection<AIR_StateViewModel>(this.AirStates),                            
                        }
                      ).ToObservableCollection<NAPS_AgencyCodeViewModel>();  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多