我有一个ComboBox,其XAML如下所示:
<StackPanel Grid.Row = "0" Style="{DynamicResource chartStackPanel}">
<Label Content="Port:" HorizontalAlignment="Left" Margin="8,0,0,0"/>
<ComboBox Width="75" Height="24" HorizontalAlignment="Right" Margin="8,0,0,0" SelectedValue="{Binding Port, Mode=OneWayToSource}">
<ComboBoxItem Content="C43"/>
<ComboBoxItem Content="C46" IsSelected="True"/>
<ComboBoxItem Content="C47"/>
<ComboBoxItem Content="C48"/>
</ComboBox>
</StackPanel>
上面引用的样式定义如下:
首次显示ComboBox时,我希望ComboBox中显示“C46”项。但是,加载时,ComboBox为空。有趣的是,我的VM中的source属性被设置为'C46'。谁能说出我做错了什么?
答案 0 :(得分:1)
您提到ViewModel中有源集合。因此,为什么要在XAML中逐个指定ComboBoxItem?我认为你应该在ViewModel中有一个Items属性属性和SelectedItem属性。在构造函数中,您可以设置SelectedItem。它看起来如下:
public ObservableCollection<MyClass> Items { get;set; }
public MyClass SelectedItem
{
get {return this.selectedItem;}
set {
this.selectedItem = value;
RaisePropertyChanged("SelectedItem");
}
}
在Items属性初始化之后的构造函数中:
this.SelectedItem = Items[x]
您的XAML可以如下所示:
<ComboBox Width="75" Height="24" HorizontalAlignment="Right" Margin="8,0,0,0"
ItemsSource="{Binding Items}"
SelectedItem="{Binding Path=SelectedItem}"
DisplayMemberPath="Content"/>
答案 1 :(得分:0)
我按照相同的方式在屏幕加载时显示'C46'。
但是,由于您未使用 SelectedValuePath 来指定绑定值路径,因此VM将显示System.Windows.Controls.ComboBoxItem: C46
而不是C46
我使用SelectedValuePath="Content"
它会显示'C46'
答案 2 :(得分:-2)
//查看
<ComboBox x:Name="cbCategories" Width="300" Height="24" ItemsSource="{Binding Categories}"
DisplayMemberPath="CategoryName" SelectedItem="{Binding SelectedCategory}" />
// ViewModel
private CategoryModel _SelectedCategory;
public CategoryModel SelectedCategory
{
get { return _SelectedCategory; }
set
{
_SelectedCategory = value;
OnPropertyChanged("SelectedCategory");
}
}
private ObservableCollection<CategoryModel> _Categories;
public ObservableCollection<CategoryModel> Categories
{
get { return _Categories; }
set
{
_Categories = value;
_Categories.Insert(0, new CategoryModel()
{
CategoryId = 0,
CategoryName = " -- Select Category -- "
});
SelectedCategory = _Categories[0];
OnPropertyChanged("Categories");
}
}