2014-09-20 63 views
2

提供的任何项目假设我叫人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。

+0

请确保已初始化并通知更改中的“性别”属性。 – pushpraj 2014-09-20 00:58:02

+0

是性别属性已初始化,并且它正在通知更改。 – Vishal 2014-09-20 00:59:59

+0

尝试在“性别”属性中将'Gender'属性设置为'Gender'实例之一。因为我相信'SelectedItem'应该被设置为'ItemsSource'成员项目 – har07 2014-09-20 01:04:51

回答

3

您遇到了一个非常普遍的问题,两个相同的物体并不相同!

ComboBox看到绑定的选定项目,但看不到匹配的项目(实际上,它看不到匹配的参考),因此它不会选择任何项目。

为了修正它,Gender需要重写Object.EqualsMSDN)和Object.GetHashCodeMSDN)。根据这article执行IEquatable也将工作。

+0

我重写了Equals和GetHashCode()方法。现在我可以获得selectedPerson的性别。但是,当我从comboBox中选择任何性别,然后我得到另一个错误:无法投入'MS.Internal.NamedObject'类型的对象键入'SampleProject.Models.Gender'。 – Vishal 2014-09-20 01:43:48

+0

我添加了一个条件if(obj是Gender)。现在它工作正常。 – Vishal 2014-09-20 02:14:32

+0

@Vishal很高兴你能够得到它的工作! – BradleyDotNET 2014-09-20 04:05:33