2015-10-13 48 views
0

我正在將事件驅動的應用程序轉換爲MVVM,並嘗試將代碼隱藏最小化。其中一個視圖有一個DataGrid,我用一個實現了ICommandSource的UserControl放置了一個列。當您單擊控件(「LinkLabel」)時,應用程序應爲DataRow的綁定對象啓動一個新選項卡。所以我已經將DataGrid的SelectedItem屬性綁定到ViewModel中的相應屬性。一切工作正常,只要用戶先選擇DataRow,然後單擊LinkLabel。但這不是典型的用戶行爲。如何使用帶有MVVM模式的XAML識別DataGrid的行

我的問題是:如何讓我的DataGrid選擇父DataRow之前發射命令?我想這不是概念上的解決方案,但它(希望)能夠解決問題。

的DataGrid

<DataGrid Name="dgPeople" MouseDoubleClick="dgPeople_MouseDoubleClick" 
     ItemsSource="{Binding CollectionOfPeople}" SelectedValuePath="DatabaseId" SelectedItem="{Binding SelectedPerson}" 
     AutoGenerateColumns="False" RowHeaderWidth="0" IsReadOnly="True" 
     ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" 
     Grid.Row="1" > 
<DataGrid.Columns> 
    <DataGridTemplateColumn Header="Name" Width="*"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <view:LinkLabel Content="{Binding FullName}" 
           Command="{Binding Source={StaticResource vm}, Path=LaunchPersonDetailCmd}" 
           FontWeight="Normal" VerticalAlignment="Center" Margin="0" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    ... 
    <DataGridTextColumn Header="Job Title" Binding="{Binding JobTitle}" 
         Width="*" /> 
    <DataGridTextColumn Header="Status" Binding="{Binding Status}" 
         Width="*" /> 
    ... 
</DataGrid.Columns> 

我可以提供其他的代碼需要,但沒有別的似乎直接相關。

謝謝!

回答

1

有幾種不同的方法可以做到這一點。只能看到的方式是使用一種行爲來監視點擊消息,從而冒泡層次結構並直接操縱可視化樹,但是我個人認爲在視圖模型中執行它會更好。我需要查看你的LinkLabel控件,但是如果它與標準的WPF控件類似,那麼它應該有一個CommandParameter,你可以使用它來綁定到行數據上下文並作爲參數傳遞到你的命令處理程序中。然後它只是一個讓處理程序把SelectedItem設置爲任何被傳入的東西。

我懷疑你的LinkLabel實際上並不是一個必要的控件,它可以用一個常規的數據模板替換,該模板包含一個模板化的按鈕,它很容易支持你想要做什麼,但我需要更多關於控制實際操作的細節。

+0

謝謝馬克。你對LinkLabel是正確的。它實際上只是一個標籤,它的格式看起來像一個超鏈接,然後擴展來實現ICommandSource,因此它需要一個CommandParameter。它可能更簡單地作爲一個DataTemplate完成,但它運行良好,我不會搞砸它。 – DPH

+0

我會用參數方法修補 - 這是個好主意。再次感謝。 DPH – DPH

+1

跟進。你完全正確。我擺脫了LinkLabel,並用帶有樣式按鈕的DataTemplate替換了它。我仍在調整細節,但這是一個更清潔的解決方案......哦,並使用按鈕的CommandParameter傳遞上下文。再次感謝。 DPH – DPH