2014-09-20 64 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