[英]WPF ComboBox Binding to ObservableCollection
我是 WPF 的新用户,我有一个问题。 我有组织模块:
class Organization : ObservableObject
{
public string OrganizationName { get; set; }
}
我有组织的 ViewModel:
class OrganizationViewModel : ObservableObject
{
int _count = 0;
public OrganizationViewModel()
{
Organization = new Organization {OrganizationName = "New Organization"};
}
public Organization Organization { get; set; }
public string OrganizationName
{
get { return Organization.OrganizationName; }
set
{
if(Organization.OrganizationName != value)
{
Organization.OrganizationName = value;
RaisePropertyChanged("OrganizationName");
}
}
}
我有所有组织的 ViewModel:
class AllOrganizationsViewModel
{
private ObservableCollection<OrganizationViewModel> m_organizations = new ObservableCollection<OrganizationViewModel>();
public ObservableCollection<OrganizationViewModel> Organizations
{
get { return m_organizations; }
set { m_organizations = value; }
}
public AllOrganizationsViewModel()
{
for(int i = 0; i < 3; ++i)
{
m_organizations.Add(new OrganizationViewModel());
}
}
void AddOrganizationNameExecute()
{
m_organizations.Add(new OrganizationViewModel());
}
bool CanAddOrganizationNameExecute()
{
return true;
}
public ICommand AddOrganization{get{return new RelayCommand(AddOrganizationNameExecute, CanAddOrganizationNameExecute);}}
}
这是 MainWindow.xaml:
<Window x:Class="DataIntegrityChecker.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataIntegrityChecker.ViewModels" Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:AllOrganizationsViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="285*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="156" />
<ColumnDefinition Width="347*" />
</Grid.ColumnDefinitions>
<Label Content="Organization: " Margin="0,0,44,0" />
<Button Grid.Row="1" Name="UpdateOrganizations" Content="Update Organization Name" Command="{Binding AddOrganization}" Margin="0,0,0,262" HorizontalAlignment="Left" Width="156" />
<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="{Binding Organizations}" />
</Grid>
</Window>
现在,我在 ComboBox 项中得到的是 class OrganizationViewModel 的名称,但我需要的是 OrganizationName 字符串。 在我看来,我对缺少的 OrganizationName 有一些绑定,但我不知道在哪里添加 if(如果这是问题所在)。 我假设我可以用我需要的组织的名称制作一个字符串集合。 但将来我将需要组织 Class 中的更多属性,所以这就是我需要它工作的方式。
我将不胜感激任何帮助
您需要添加DisplayMemberPath
:
<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="{Binding Organizations}"
DisplayMemberPath="OrganizationName"/>
另一种方法可以是定义ItemTemplate。 它为显示提供了更大的灵活性
<ComboBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Name="comboBox1" VerticalAlignment="Top" Width="155" ItemsSource="{Binding Organizations}" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding OrganizationName}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
您好,这是我解决您问题的建议:
背后的代码:
private ObservableCollection<customObj> customObjs = new ObservableCollection<customOb>();
public ObservableCollection<customObj> CustomObjs
{
get => customObj;
set
{
customObj = value;
}
}
和
public class customObj
{
private uint number;
public uint Number
{
get { return number; }
set
{
if (number != value)
{
number = value;
}
}
}
}
在 Xaml 文件中:
<Style x:Key="ComboBoxCustomObjStyle" TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=CustomObjs}"/>
<Setter Property="DisplayMemberPath" Value="Number"/>
<Setter Property="SelectedValuePath" Value="Number"/>
<Setter Property="SelectedValue" Value="0"/>
</Style>
<ComboBox x:Name="CbSelectCustomObj"
Style="{StaticResource ComboBoxCustomObjStyle}"/>
请记住,在显示 combobox 之前,请确保已填充可观察集合!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.