I am new in WPF programming with MVVM pattern. Now I have added the context menu in the datagrid. But, when I click the right mouse button, I don't know how to get the select row value. this is my xmal
<DataGrid AutoGenerateColumns="False" Grid.Row="1" CanUserAddRows="False" CanUserDeleteRows="False"
ItemsSource="{Binding StoryList}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}" Width="40" IsReadOnly="True" />
<DataGridTextColumn Header="Title" Binding="{Binding Title}" Width="60" IsReadOnly="True"/>
<DataGridTextColumn Header="StoryPoints" Binding="{Binding StoryPoints}" Width="90" IsReadOnly="True">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Binding="{Binding StoryPoints}" Value="0">
<Setter Property="Background" Value="Red"/>
<Setter Property="ToolTip" Value="Story Point cannot be 0."/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Stack Rank" Binding="{Binding StackRank}" Width="80"/>
<DataGridTextColumn Header="Estimate" Binding="{Binding Estimate}" Width="60"/>
<DataGridTextColumn Header="CompletedWork" Binding="{Binding CompletedWork}" Width="120" />
<DataGridTextColumn Header="RemainWork" Binding="{Binding RemainWork}" Width="110" />
<DataGridTextColumn Header="CompleteProcess" Binding="{Binding CompletedProcess}" Width="110" />
<DataGridTextColumn Header="YesterdayComments" Binding="{Binding YesterdayComments}" Width="120" />
<DataGridTextColumn Header="TodayComments" Binding="{Binding TodayComments}" Width="120" />
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu Name="StoryMenu" StaysOpen="True">
<MenuItem Header="Add an Issue" Command="{Binding AddIssueCommand}" />
<MenuItem Header="Burn Down Chart" Command="{Binding BurnDownChartCommand}"/>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
And here is my viewModel
class MainViewModel:NotificationObject
{
private ObservableCollection<Story> storyList;
public ObservableCollection<Story> StoryList
{
get { return storyList; }
set
{
storyList = value;
this.RaisePropertyChanged("StoryList");
}
}
public DelegateCommand AddIssueCommand { get; set; }
public DelegateCommand BurnDownChartCommand { get; set; }
private Story selectStory;
public Story SelectStory
{
get { return selectStory; }
set
{
selectStory = value;
this.RaisePropertyChanged("SelectStory");
}
}
public void LoadStory()
{
this.storyList = new ObservableCollection<Story>();
Story story1 = new Story(){ID=1, Title="win App", StoryPoints=0, StackRank=1, Estimate=40, CompletedWork=10, RemainWork=30, CompletedProcess=25, TodayComments="Coding", YesterdayComments="N/a"};
Story story2 = new Story() { ID = 2, Title = "win App", StoryPoints = 10, Estimate = 40, CompletedWork = 10, RemainWork = 30, CompletedProcess = 25, TodayComments = "Coding 20%", YesterdayComments = "N/a" };
Story story3 = new Story() { ID = 3, Title = "win App", StoryPoints = 10, Estimate = 50, CompletedWork = 20, RemainWork = 30, CompletedProcess = 20, TodayComments = "Coding 30%", YesterdayComments = "N/a" };
Story story4 = new Story() { ID = 4, Title = "win App", StoryPoints = 10, Estimate = 60, CompletedWork = 30, RemainWork = 30, CompletedProcess = 50, TodayComments = "Coding 40%", YesterdayComments = "N/a" };
Story story5 = new Story() { ID = 5, Title = "win App", StoryPoints = 10, Estimate = 40, CompletedWork = 10, RemainWork = 30, CompletedProcess = 25, TodayComments = "Coding 50%", YesterdayComments = "N/a" };
Story story6 = new Story() { ID = 6, Title = "win App", StoryPoints = 10, Estimate = 30, CompletedWork = 30, RemainWork = 0, CompletedProcess = 100, TodayComments = "Coding 60%", YesterdayComments = "N/a" };
storyList.Add(story1);
storyList.Add(story3);
storyList.Add(story2);
storyList.Add(story4);
storyList.Add(story5);
storyList.Add(story6);
}
public MainViewModel()
{
this.SelectStory = new Story();
this.LoadStory();
this.AddIssueCommand = new DelegateCommand(new Action(this.AddIssueCommandExecute));
}
public void AddIssueCommandExecute()
{
if (SelectStory != null)
{
System.Windows.MessageBox.Show("Add an Issue" + SelectStory.Title + "!");
}
else
{
System.Windows.MessageBox.Show("choose an story first!");
}
//System.Windows.MessageBox.Show("record" + RecordIndex);
}
}![What I need][1]
Thank you very much
i know this is an old question , but i wanted to share this very easy solution
xaml :
code behind:
bigworld12 has close to the right answer here, but it breaks if your context menu is templated. Try:
for the code-behind. I used nullable operators in case you somehow get here without the expected parent tree and target (maybe by triggering the context menu while off the grid.)
This is a common problem in WPF. The solution is to utilise a
Tag
property in the itemDataTemplate
to hold the data item. First, let's add this part:Now that we have access to the
DataContext
of theUserControl
which can be found in theTag
property of each data object, let's bind to this from theContextMenu
... we do it using a handy property calledPlacementTarget
:One thing to note is the
YourCollection.CurrentItem
property shown in theCommandParameter
above. TheCurrentItem
property is a property that I added into my collection classes to bind to theSelectedItem
properties of collection controls in the UI. If you don't have one of these, it's ok, but you will need a property that is bound to theSelectedItem
property of your collection control for this to work. For my example, I have this:Expanding on Bolu's comment you could use
SelectedItem
to get the current item. Below is a quick example:SelectedItem
is now bound toSelectedItemProperty
in the ViewModel.