如何从Silverlight中的datagrid with context菜单中删除选定的行?

时间:2011-03-21 00:00:21

标签: silverlight datagrid

我需要能够使用“删除”上下文菜单项从数据网格中删除选定的行。我很难找到所选行的路径。我想知道是否有人可以查看下面的代码让我知道在我的代码中做什么是合适的。提前谢谢你。

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);     
    }
}

视图模型:

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 个答案:

答案 0 :(得分:2)

更新您的数据网格以绑定到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的setter中,以便更新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;
        }
    }

答案 1 :(得分:0)

将数据网格SelectedItem绑定到ViewModel中的属性。单击删除按钮时,使用命令在ViewModel中触发方法。然后从ObservableCollection中删除该项目。

如果要删除多个项目: Handling DataGrid.SelectedItems in an MVVM-friendly manner