Ниже приведен код, который почти работает так, как я хочу. Я пытаюсь получить его, поэтому вы нажимаете на строку, и я беру идентификатор программы и использую его в другом месте, эта часть работает. Однако я не хочу, чтобы ничего не случилось, если я нажму на столбец статуса, который имеет встроенный combobox, как я ограничу его использованием этого столбца? Я использую MVVM, если это необходимоXAML Datagrid, выбранное значение, но только для некоторых столбцов
<DataGrid x:Name="gridResult" IsSynchronizedWithCurrentItem="True" SelectedValue ="{Binding ModelRequestSV}" Grid.Row="2" Grid.RowSpan="5" Grid.ColumnSpan="4" IsReadOnly="TRue" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" CanUserAddRows="false" AutoGenerateColumns="False" ItemsSource="{Binding ModelRequestObs}" HorizontalGridLinesBrush="Gray" GridLinesVisibility="Horizontal" Style=" {DynamicResource DataGridStyle1}" Margin="0,25,0,10" >
<DataGrid.InputBindings>
<MouseBinding
MouseAction="LeftDoubleClick"
Command="{Binding DoubleClickCommand}"
CommandParameter="{Binding ModelRequestSV}"/>
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding ProgramID}" Header="Program ID" Width="100" />
<DataGridTextColumn Binding="{Binding Cedant}" Header="Cedant" Width="300" />
<DataGridTextColumn Binding="{Binding UWCode}" Header="Underwriter" Width="145"/>
<DataGridTextColumn Binding="{Binding DateSubmitted}" Header="Date Submitted" Width="145"/>
<DataGridTextColumn Binding="{Binding RequiredDate}" Header="Required Date" Width="145"/>
<DataGridTextColumn Binding="{Binding Priority}" Header="Priority" Width="145"/>
<DataGridTemplateColumn Header="Status" Width="140">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="110" Text="{Binding Status}" />
<ComboBox Text="{Binding Status}"
Width="20" Height="20"
BorderThickness="0"
SelectedItem="{Binding Status}"
ItemsSource="{Binding DataContext.StatusCodes, ElementName=userControl}"
SelectionChanged="DataGrid_SelectionChanged">
</ComboBox>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
вот моя ViewModel логика
private ModelRequest _modelRequestSV;
private void NotifyProgrIdToParent()
{
CAT_Application_WPF.UI.App.MainViewModel.ProgIdCommand.Execute(_modelRequestSV.ProgramID.ToString());
}
public ModelRequest ModelRequestSV
{
get { return _modelRequestSV; }
set
{
if (value != _modelRequestSV)
{
_modelRequestSV = value;
OnPropertyChanged(nameof(ModelRequestSV));
if (ModelRequestSV != null)
{
NotifyProgrIdToParent();
}
}
}
}
попытку. firstSelectedCell.Column.DisplayIndex.ToString() всегда возвращает «0» независимо от того, где я нажимаю, в чем проблема?
private void DataGrid_MouseDoubleClick(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
System.Windows.Controls.DataGrid myGrid = (System.Windows.Controls.DataGrid)sender; // now this is strongly typed so we can drill into its properties.
var vm = (NotesManagerViewModel)DataContext;
var selectedCells = myGrid.SelectedCells; // there can be more than one cell selected! Which column is that in?
if (selectedCells.Count > 0)
{
DataGridCellInfo firstSelectedCell = selectedCells[0]; // usually there will be only one selected. If not, think about how you want to handle this.
DataGridColumn ignoreThisColumn = myGrid.Columns[7]; // whichever column you want to ignore - you could also have several columns in an array...
if (firstSelectedCell.Column.DisplayIndex.ToString() != ignoreThisColumn.DisplayIndex.ToString())
{
vm.NotifyProgrIdToParent();
}
}
}
Я буду редактировать то, что моя текущая логика. Могу ли я просто взять логику с виртуальной машины и разместить ее там? – James
Похоже, что у вас есть двойной щелчок, обрабатываемый кодом в вашей виртуальной машине, а SelectionChanged обрабатывается вашим кодом (SelectionChanged = "DataGrid_SelectionChanged") - этот ответ будет применяться к коду. Если вы хотите, чтобы проверки выполнялись в вашей виртуальной машине, то все, с чем вам нужно работать, это ModelRequestSV - я не уверен, можете ли вы понять это или нет. Из вашей виртуальной машины у вас нет прямого представления о представлении (и вы этого не хотите - это нарушит MVVM). Поскольку «столбец, который был нажат», зависит от вида, этот тип логики, вероятно, принадлежит коду позади. –
Хотя пуристы будут меня в 3 ... 2 ... 1 ... –