WPF - 组合框不在列表视图中呈现(仅第一个)
WPF - Comboboxes doesn't render in a listview (only the first one)
我有一个 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>();
非常感谢!
O.K, 我发现了我的问题...
我以这种方式填充了组合的集合:
在构造器中,我只将 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>();
我有一个 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>();
非常感谢!
O.K, 我发现了我的问题... 我以这种方式填充了组合的集合: 在构造器中,我只将 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>();