2013-05-23 3 views
1

У меня есть ListView, который отображает изображение, два текстовых поля и поле со списком. ListView привязан к коллекции в моей модели просмотра. Combobox привязан к еще одной коллекции в моей модели просмотра, и выбранный элемент привязан к свойству в объекте в списке.
Ожидаемые результаты: для каждого элемента поле со списком отображает значение текущего изображения. Затем пользователь должен иметь возможность выбрать новое значение в раскрывающемся списке и присваивается объекту изображения.привязки в моей combobox WPF не работают?

Что я получаю: пустое поле со списком! Когда я нажимаю кнопку v, отображаются все элементы без имени.

Моя модель взглядов (она должна жить в рамках конструкций нашего текущего приложения) Я удалил команды для краткости. Элементы - это коллекция, связанная с ListView, а ArtifactTypes - это список элементов, для которых объект установлен в ListView.

[AssociatedView(typeof(ManageImageView))] 
public class ManageImagesViewModel : ClosableViewModelBase 
{ 
    private Guid jobid; 
    private TSObservableCollection<MobileImage> items = new TSObservableCollection<MobileImage>(); 
    private TSObservableCollection<ArtifactType> artifactTypes = new TSObservableCollection<ArtifactType>(); 

    public TSObservableCollection<MobileImage> Items 
    { 
     get 
     { 
      return items; 
     } 
     set 
     { 
      items = value; 
     } 
    } 
    public TSObservableCollection<ArtifactType> ArtifactTypes 
    { 
     get 
     { 
      return artifactTypes; 
     } 
     set 
     { 
      if (artifactTypes != value) 
       artifactTypes = value; 
     } 
    } 

    public override string Title 
    { 
     get { return "Add and Delete Images"; } 
    } 

    public ManageImagesViewModel(IUnityContainer container) 
     : base(container) 
    { 
     AddImage = new SimpleCommand(HandleAddImage); 
     UpdateAll = new SimpleCommand(HandleUpdateAll); 
     ExitRequest = new SimpleCommand(HandleExitProcess); 
     DeleteCommand = new SimpleGenericCommand<Guid>(HandleDeleteProcess); 
     List<ArtifactTypeDto> types = BusinessEngine.Mobile.GetTypeDefinitions(); 
     foreach (ArtifactTypeDto element in types) 
     { 
      ArtifactTypes.Add(new ArtifactType(element.Name, element.ArtifactTypeId)); 
     } 
    } 

И мое определение мнения:

  <ListView Width="510" MinHeight="600" ItemsSource="{Binding Items}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="4" Height="160" Width="Auto"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="160"/> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="50" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="42" /> 
          <RowDefinition Height="25" /> 
          <RowDefinition Height="25" /> 
          <RowDefinition Height="25" /> 
          <RowDefinition Height="42" /> 
         </Grid.RowDefinitions> 
         <Image Source="{Binding Path=Image, Mode=OneWay}" Grid.Column="0" Grid.RowSpan="5" Margin="4" Height="150" Width="150" VerticalAlignment="Center" HorizontalAlignment="Center"/> 
         <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=Name, Mode=TwoWay}" FontWeight="Bold" MinWidth="250" FontSize="12"/> 
         <TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Path=Comment, Mode=TwoWay}" FontSize="12" /> 
         <ComboBox Grid.Column="1" Grid.Row="3" ItemsSource="{Binding ArtifactTypes, Mode=OneTime}" DisplayMemberPath="Name" SelectedValuePath="Key" SelectedValue="{Binding Path=ArtifactTypeIdentity, Mode=TwoWay}" FontSize="12"/> 
         <Button Grid.Column="2" Grid.Row="1" Command="{Binding DeleteCommand}" CommandParameter="{Binding Path=ArtifactIdentity}"> 
          <Button.Content> 
           <Image Margin="5,0,0,0" Height="24" Width="24" VerticalAlignment="Center" HorizontalAlignment="Center" Source="pack://application:,,,/SERVPRO.WorkCenter.Common.UI;component/Images/DeleteRed.png"/> 
          </Button.Content> 
         </Button> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListView> 

Наконец - вот определение значений для заполнения выпадающего:

public class ArtifactType:INotifyPropertyChanged 
{ 

    public ArtifactType(string name, Guid value) 
    { 
     this.Name = name; 
     this.Key = value; 
    } 

    private string name; 
    private Guid key; 

    public string Name 
    { 
     get { return name; } 
     set 
     { 
      if (name != value) 
      { 
       name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 

    public Guid Key 
    { 
     get { return key; } 
     set 
     { 
      if (key != value) 
      { 
       key = value; 
       NotifyPropertyChanged("Key"); 
      } 
     } 
    } 

    private void NotifyPropertyChanged(string p) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(p)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Так ли кто-нибудь увидеть в моих привязках Почему я получить пустой список списков? (TSObservableCollection является нашим потокобезопасным ObservableCollection для обработки обновления коллекции, если не в потоке пользовательского интерфейса, но с уведомлением об этом пользовательского интерфейса.)

+0

Что сказать, если вы добавите PresentationTraceSources.TraceLevel = Высокий в привязке ItemsSource? Я не вижу проблемы иначе. Вы уверены, что не переустанавливаете ArtifactTypes в модели представления? Удалите установщик в ArtifactTypes, если вы его не используете, иначе добавьте также уведомление PropertyChanged. Попробуйте использовать [snoop] (http://snoopwpf.codeplex.com/), чтобы найти проблему в своем ui. – dowhilefor

+1

взгляните на http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial –

+0

Спасибо Рэйчел, но я понимаю основы MVVM. Это было просто обращение к двум иерархическим уровням, откуда поступали данные. Итак, когда вы переезжаете в Нашвилл и женитесь на мне? :) –

ответ

1

Если вы посмотрите в окне «Вывод» во время работы в Visual Studio, вы должен видеть, что существует ошибка привязки.

Как у вас есть набор привязок, он ищет ArtifactTypes как свойство Items, а не вашей ViewModel, потому что это часть ItemTemplate, которую определяют Items.

Попробуйте что-то вроде этого:

ItemsSource="{Binding DataContext.ArtifactTypes, Mode=OneTime, 
       RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" 

Что это делает связывает ItemsSource к свойству ArtifactTypes в DataContext в ListView. Этот DataContext является вашей ViewModel.

+1

Wonko the Sane - я люблю ваше имя !!! Я понял, что он был запутан между источником ListView, а источник DataContext действительно не знал, как его решить! Огромное спасибо. Работает как сопли на скрипучих петлях. :) –

+0

Да - привязки могут быть надоедливыми тварями –

Смежные вопросы