Как удалить выбранную строку из таблицы данных с помощью контекстного меню в Silverlight? - PullRequest
0 голосов
/ 21 марта 2011

Мне нужно иметь возможность удалить выбранную строку из таблицы данных с помощью пункта контекстного меню «Удалить». Мне трудно найти путь к выбранной строке. Мне интересно, может ли кто-нибудь взглянуть на приведенный ниже код и дать мне знаю, что будет уместно сделать в моем коде. Заранее спасибо.

XAML:

<UserControl.DataContext>     
    <local:MainPage_ViewModel/> 
</UserControl.DataContext>  
<StackPanel Orientation="Horizontal">  

    <data:DataGrid ItemsSource="{Binding Coordinates}" AutoGenerateColumns="False" Margin="10">
        <!-- ContextMenu -->
          <toolkit:ContextMenuService.ContextMenu>
             <toolkit:ContextMenu x:Name="Menu" >
                <toolkit:MenuItem x:Name="Edit" />
                <toolkit:MenuItem x:Name="Delete" Tag="{Binding}" Click="Button_Click" />
            </toolkit:ContextMenu>
        </toolkit:ContextMenuService.ContextMenu>      
        <data:DataGrid.Columns>             
            <data:DataGridTextColumn Header="X Position" Width="100" Binding="{Binding X}"/>             
            <data:DataGridTextColumn Header="Y Position" Width="100" Binding="{Binding Y}"/>             
            <data:DataGridTemplateColumn Header="Delete Item" Width="100">                 
                <data:DataGridTemplateColumn.CellTemplate>                     
                    <DataTemplate>                         
                        <Button Content="Delete" Tag="{Binding}" Click="Button_Click"/>                     
                    </DataTemplate>                 
                </data:DataGridTemplateColumn.CellTemplate>             
            </data:DataGridTemplateColumn>         
        </data:DataGrid.Columns>     
    </data:DataGrid>

Код:

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();         
        this.viewModel = this.DataContext as MainPage_ViewModel; 
    }

    private MainPage_ViewModel viewModel;      
    private void Button_Click(object sender, RoutedEventArgs e)     
    {         
        viewModel.DeleteCoordinate((sender as Button).Tag as Coordinate_DataViewModel);     
    }
}

ViewModel:

public class MainPage_ViewModel : INotifyPropertyChanged 
{
    public MainPage_ViewModel()
    {
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 1, Y = 2 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 2, Y = 4 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 3, Y = 6 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 4, Y = 8 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 5, Y = 10 }));         
        coordinates.Add(new Coordinate_DataViewModel(new Coordinate_Model() { X = 6, Y = 12 }));
    }

    public ObservableCollection<Coordinate_DataViewModel> Coordinates     
    {         
        get { return coordinates; }         
        set          
        {             
            if (coordinates != value)             
            {                 
                coordinates = value;                 
                OnPropertyChanged("Coordinates");             
            }         
        }     
    }     
    private ObservableCollection<Coordinate_DataViewModel> coordinates = new ObservableCollection<Coordinate_DataViewModel>();      
    public event PropertyChangedEventHandler PropertyChanged;      

    public void OnPropertyChanged(string propertyName)     
    {         
        if (PropertyChanged != null)         
        {             
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));         
        }     
    }      

    public void DeleteCoordinate(Coordinate_DataViewModel dvmToDelete)     
    {         
        coordinates.Remove(dvmToDelete);     
    }

    public void UpdateCoordinate(Coordinate_DataViewModel dvmToDelete)
    {

    }
}

//Model
public class Coordinate_Model 
{     
    public double X;     
    public double Y; 
} 

//DataViewModel
public class Coordinate_DataViewModel 
{     
    public Coordinate_DataViewModel(Coordinate_Model model)     
    {         
        this.underlyingModel = model;     
    }     

    private Coordinate_Model underlyingModel;      
    public double X     
    {         
        get { return underlyingModel.X; }         
        set { underlyingModel.X = value; }     
    }      

    public double Y     
    {         
        get { return underlyingModel.Y; }         
        set { underlyingModel.Y = value; }     
    }      public string XYCoordinate     

    {         
        get { return "(" + X + "," + Y + ")"; }     
    } 
}

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

Обновите вашу сетку данных для привязки к выбранному элементу в вашей viewModel.Обновите свою сетку данных следующим образом:

<data:DataGrid ItemsSource="{Binding Coordinates}" AutoGenerateColumns="False" Margin="10" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">

В вашей модели представления добавьте следующее свойство:

public Coordinate_DataViewModel SelectedItem
    {
        get { return selectedItem; }
        set { selectedItem = value; }
    }
    private Coordinate_DataViewModel selectedItem;

Затем вы можете добавить следующий метод в модель представления:

public void DeleteSelectedItem()
    {
        DeleteCoordinate(this.SelectedItem);
    }

Теперь, подключите вашу кнопку «Удалить» в контекстном меню к DeleteSelectedItem (), и все будет хорошо.

Надеюсь, это поможет!

Отредактируйте для ответа на комментарий: Вот пример того, что вы могли бы добавить, чтобы реализовать проблему, о которой вы упоминали в комментариях, где вы не всегда хотите иметь возможность удалить элемент.Обратите внимание, что я добавил INotifyPropertyChanged в установщик SelectedItem, чтобы привязки IsDeletable были обновлены.

public Coordinate_DataViewModel SelectedItem
    {
        get { return selectedItem; }
        set 
        { 
            selectedItem = value;
            OnPropertyChanged("IsDeletable");
        }
    }
    private Coordinate_DataViewModel selectedItem;

    public Visibility IsDeletable
    {
        get
        {
            if (SelectedItem.Y == 2)
            {
                return Visibility.Collapsed;
            }

            return Visibility.Visible;
        }
    }
0 голосов
/ 21 марта 2011

Свяжите сетки данных SelectedItem со свойством в вашей модели представления. Используйте команду для запуска метода в вашей ViewModel при нажатии кнопки удаления. Затем удалите элемент из коллекции ObservableCollection.

Если вы хотите удалить несколько элементов: Обработка DataGrid.SelectedItems в MVVM-дружественной манере

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...