提供的任何项目假设我叫人Model类看起来像下面的代码:在Person类使用组合框不选择从视图模型
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public Gender Gender { get; set; }
}
性别类的样子:
public class Gender
{
public int ID { get; set; }
public string Name { get; set; }
public string ImageData { get; set; }
}
现在在视图中称为EditView我试图显示当前选择的人的信息:
<Page ...............>
<Page.DataContext>
<vm:EditViewModel />
</Page.DataContext>
<Grid DataContext="{Binding CurrentPerson}">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<TextBox Text="{Binding Name}" />
<ComboBox Grid.Row="1"
ItemsSource="{Binding DataContext.Genders, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Page}}}"
SelectedItem="{Binding Gender}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" Padding="6"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid x:Name="gd" TextElement.Foreground="Black">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Path Grid.Column="0" Data="{Binding ImageData}" Stretch="Uniform" Fill="Black" Width="24" Height="24" Margin="4" RenderTransformOrigin="0.5,0.5" />
<TextBlock Grid.Column="1" Text="{Binding Name}" Padding="6"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="ComboBoxItem.IsSelected" Value="True">
<Setter TargetName="gd" Property="Background" Value="#FF4CC4F6"></Setter>
<Setter TargetName="gd" Property="TextElement.Foreground" Value="White"></Setter>
</Trigger>
<Trigger Property="ComboBoxItem.IsMouseOver" Value="True">
<Setter TargetName="gd" Property="Background" Value="#FF84CDFA"></Setter>
<Setter TargetName="gd" Property="TextElement.Foreground" Value="White"></Setter>
</Trigger>
<Trigger Property="ComboBoxItem.IsHighlighted" Value="True">
<Setter TargetName="gd" Property="Background" Value="LightSkyBlue"></Setter>
<Setter TargetName="gd" Property="TextElement.Foreground" Value="Black"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</Grid>
</Page>
EditViewModel。 cs代码:
public class EditViewModel : ViewModelBase
{
public EditViewModel()
{
Genders = new ObservableCollection<Gender>(
from gender in XDocument.Load(DirectoryPaths.DataDirectory + @"Basic\Genders.xml")
.Element("Genders").Elements("Gender")
select new Gender
{
Id = Convert.ToInt32(gender.Attribute("Id").Value),
Name = gender.Element("Name").Value,
ImageData = gender.Element("ImageData").Value
}
);
}
private ObservableCollection<Gender> _genders;
public ObservableCollection<Gender> Genders
{
get
{
return _genders;
}
set
{
_genders = value;
NotifyPropertyChanged("Genders");
}
}
private Person _currentPerson;
public Person CurrentPerson
{
get
{
return _currentPerson;
}
set
{
_currentPerson = value;
NotifyPropertyChanged("CurrentPerson");
}
}
}
我已经为viewmodel添加了相关代码。显示EditView时,属性CurrentPerson有一个人。但在ComboBox中,我没有得到任何默认选择。我可以手动选择值。但是当EditView加载时,我无法说出该人的性别,因为它不会显示为ComboBox的SelectedItem。
请确保已初始化并通知更改中的“性别”属性。 – pushpraj 2014-09-20 00:58:02
是性别属性已初始化,并且它正在通知更改。 – Vishal 2014-09-20 00:59:59
尝试在“性别”属性中将'Gender'属性设置为'Gender'实例之一。因为我相信'SelectedItem'应该被设置为'ItemsSource'成员项目 – har07 2014-09-20 01:04:51