У меня есть 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 для обработки обновления коллекции, если не в потоке пользовательского интерфейса, но с уведомлением об этом пользовательского интерфейса.)
Что сказать, если вы добавите PresentationTraceSources.TraceLevel = Высокий в привязке ItemsSource? Я не вижу проблемы иначе. Вы уверены, что не переустанавливаете ArtifactTypes в модели представления? Удалите установщик в ArtifactTypes, если вы его не используете, иначе добавьте также уведомление PropertyChanged. Попробуйте использовать [snoop] (http://snoopwpf.codeplex.com/), чтобы найти проблему в своем ui. – dowhilefor
взгляните на http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial –
Спасибо Рэйчел, но я понимаю основы MVVM. Это было просто обращение к двум иерархическим уровням, откуда поступали данные. Итак, когда вы переезжаете в Нашвилл и женитесь на мне? :) –