0

我对 wpf 和 MVVM 还是有点陌生​​。我正在尝试在不破坏该模式的情况下编写解决方案。我有两个(嗯,三个,但对于这个问题的范围只有两个)DataGrid。我想双击一个行,然后从该行加载数据到第二个DataGrid(理想情况下,我会启动第二个线程来加载数据)。到目前为止,当我双击一行时,我可以弹出一个窗口。我将事件的代码放入 xaml 背后的代码中。对我来说,这似乎很窗户形式。不知何故,我觉得这大大打破了这种模式。

private void DataGrid_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) {
    if (popDataGrid.SelectedItem == null) {
        return;
    }
    var selectedPopulation = popDataGrid.SelectedItem as PopulationModel;
    MessageBox.Show(string.Format("The Population you double clicked on has this ID - {0}, Name - {1}, and Description {2}", selectedPopulation.populationID, selectedPopulation.PopName, selectedPopulation.description));
}

这是后面代码中事件的代码,这里是 xaml 中的网格定义:

<DataGrid ItemsSource="{Binding PopulationCollection}" Name="popDataGrid"
          AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected"
          CanUserAddRows="False" Margin="296,120,0,587" HorizontalAlignment="Left" Width="503" Grid.Column="1" 
          MouseDoubleClick="DataGrid_MouseDoubleClick">
</DataGrid>

我在想这段代码应该放在 MainWindowViewModel 中。所以我试图创建一个命令:

public ICommand DoubleClickPopRow { get { return new DelegateCommand(OnDoubleClickPopRow); }}

和相同的事件处理程序:

private void OnDoubleClickPopRow(object sender, MouseButtonEventArgs e) {
}

但是ICommand当它返回时抛出异常DelegateCommand(OnDoubleClickPopRow)

嗯,可以清楚地看到参数的数量不匹配。我知道我做错了什么,但我不太确定它是什么。我将继续研究这个,但你们可以提供的任何帮助将不胜感激。

4

1 回答 1

1
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<DataGrid ItemsSource="{Binding PopulationCollection}" Name="popDataGrid"
AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected"
CanUserAddRows="False" Margin="296,120,0,587" HorizontalAlignment="Left" Width="503"  Grid.Column="1" SelectedItem="{Binding ItemInViewModel}"></DataGrid>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding Save_Bid}" />
</i:EventTrigger>
</i:Interaction.Triggers>

您可以将其添加到您DataGrid的视图模型中并将代码添加到您的视图模型中。现在我们有一个选定的项目绑定到我们的视图模型中的一个项目,我们可以使用该项目来知道我们什么时候可以触发我们想要的事件以及当事件被触发时使用什么项目什么时候可以触发事件

bool Can_Fire_Event()
{
if(ItemInViewModel != null)
{ return true; } else { return false; }
}
private RelayCommand _saveBid;
public ICommand SaveBid
{
get
{
if (_saveBid == null)
{
_saveBid = new RelayCommand(param => Save_Bid(), param => Can_Fire_Event());
}
return _saveBid;
}
}

public void Save_Bid()
{
//Open your new Window here, using your "ItemInViewModel" because this event couldn't be fired from your datagrid unless the "ItemInViewModel" had a value assigned to it

}
于 2013-06-19T15:50:08.560 回答