사용자가 행을 선택하고 다음 명령을 포함하는 VM에 명령을 입력 할 수 있도록 목록 상자를 사용하는 경우 컬렉션, 당신은 깨끗한 구현을 얻을.
여기에 삭제 버튼이있는 행의 xaml입니다. 트릭은 "RelativeSource"
<ListBox ItemsSource="{Binding MyItems, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding MySelectedItem, UpdateSourceTrigger=PropertyChanged}" >
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<StackPanel Orientation="Horizontal" >
<Label Content="{Binding}" />
<Button Content="Delete" Command="{Binding DataContext.MyDeleteCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}" />
</StackPanel >
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
그리고 뷰 모델 코드
public DelegateCommand<object> MyDeleteCommand { get; set; }
protected void DoDelete(object o)
{
MyItems.Remove(MySelectedItem);
}
protected bool CanDoDelete(object o)
{
return MySelectedItem != null;
}
string _mySelectedItem;
public string MySelectedItem
{
get { return _mySelectedItem; }
set
{
_mySelectedItem = value;
OnPropertyChanged("MySelectedItem");
MyDeleteCommand.RaiseCanExecuteChanged();
}
}
ObservableCollection<string> _myItems;
public ObservableCollection<string> MyItems
{
get { return _myItems; }
set
{
_myItems = value;
OnPropertyChanged("MyItems");
}
}
아를 사용하여 DeleteCommand에 부모 항목에있는 버튼을 결합하는 것입니다, 난 그냥 실버 및 relativeSource에 대한 위의 코멘트를 보았다. WPF로이 작업을 수행했는데 작동했는데 실버 라이트에서 작동하지 않을 수 있습니다.
WPF에서는 'RelativeSource'를 사용하여 Delete 버튼을 부모의 datacontext에있는 Delete 명령에 바인딩 할 수 있습니다. 불행히도 Silverlight의'RelativeSource'는 절름발이이고 절반은 쓸데없는 것 같습니다. –