명령이있는 viewmodel이 있습니다. 그러나 마지막으로 추가 한 항목 만 명령으로 편집 할 수 있습니다. 그것은 당신이 송시를 볼 때 의미가 있습니다. 그러나 그것은 내가 원하는 것이 아닙니다. 선택한 항목을 편집하고 싶습니다. 나는 모델이MVVM 명령은 마지막으로 추가 된 항목을 선택합니다.
라는 파트 내가 불을 시도 할 때마다 PartViewModel 이제
/// <summary>
/// Returns a ViewModel containing all parts.
/// </summary>
/// <param name="dt">Database to use.</param>
public PartViewModel(DatabaseType dt)
{
GenerateViewModelForAllParts(dt);
}
private async void GenerateViewModelForAllParts(DatabaseType dt)
{
using (NexusWCFServiceClient client = new NexusWCFServiceClient())
foreach (Part item in await client.GetAllPartsAsync(dt))
{
_part = item;
_items.Add(item);
}
}
#endregion
#region Members
private ObservableCollection<Part> _items = new ObservableCollection<Part>();
private Part _part;
int count = 0;
#endregion
#region Properties
public ObservableCollection<Part> Items
{
get { return _items; }
set { _items = value; }
}
public Part Part
{
get { return _part; }
set { _part = value; }
}
public string PartCode
{
get { return Part.PartCode; }
set
{
if (Part.PartCode != value) /* Check if value is changed */
{
Part.PartCode = value;
RaisePropertyChanged("PartCode"); /* Raise event */
}
}
}
public string Description
{
get { return Part.Description; }
set
{
if (Part.Description != value)
{
Part.Description = value;
RaisePropertyChanged("Description");
}
}
}
#region Commands
private void UpdateDescriptionExecute()
{
//count++;
//Description = Description + count.ToString();
// Part.Description = "asdasdasd";
MessageBox.Show(PartCode);
}
private bool CanUpdateDescriptionExecute()
{
if (count >= 2)
return false;
else
return true;
}
public ICommand UpdateDescription
{
get
{
return new RelayCommand(UpdateDescriptionExecute, CanUpdateDescriptionExecute);
}
}
#endregion
}
라는 명령과 함께
public class Part
{
private string _partcode;
private string _description;
public string PartCode
{
get { return _partcode.Trim(); }
set { _partcode = value; }
}
public string Description
{
get { return _description; }
set { _description = value; }
}
}
뷰 모델 : 나는 내 문제를 스케치합니다 보기의 명령 :
<Window x:Class="NexusWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="700" Width="525" x:Name="TestView">
<Grid>
<StackPanel x:Name="stck">
<ListView x:Name="lb" ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" x:Name="stck">
<TextBlock Text="{Binding Path=PartCode}"/>
<TextBlock Text="{Binding Path=Description}"/>
<Button Content="Update" DataContext="{Binding ElementName=TestView, Path=DataContext}" Command="{Binding UpdateDescription}" CommandParameter="{Binding}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
</Window>
마지막으로 추가 된 항목 (부분)이 편집됩니다. ViewModel의 다음 코드 때문에 의미가 있습니다.
_part = item;
어떻게 명령을 선택한 항목에 바인딩합니까? 나는 바인딩에있는 것이 아니라 viewmodel에 잘못된 것이 있어야한다고 생각합니다. 새로운 파트가 추가 될 때마다 _part get을 덮어 씁니다. 하지만 내가 어떻게 바꿀 수 있을까요?
당신이 어디로 가는지 내가 얻을 수 있지만 지금은 NullReferenceException이 얻을. UpdateDescriptionExecure의 'part'매개 변수가 null이므로 선택한 부분을 전달하지 않습니다. 어떤 아이디어? – Marcel
XAML 태그의
고마워요! 그것을 간과했다. 아직 한 가지 더 질문이 있지만 그 주제에 대해 새로운 주제를 만들 것입니다. – Marcel