я новичок в C# и WinUI. У меня есть приложение с TabView с одной постоянной вкладкой, содержащей DataGrid, и когда я дважды щелкаю любую строку в сетке данных, создается новый TabItem.
Я пытаюсь заполнить вновь открытый TabItem данными, в зависимости от того, по какой строке был сделан двойной щелчок. Данные во вновь открытых TabItems не могут быть перезагружены при переключении вкладок, поскольку они должны быть редактируемыми.
Как мне заполнить вновь открытые вкладки? Я нашел решения, которые динамически заполняют данные вкладок при переключении вкладок, но если вы ранее что-то в них редактировали, оно будет перезаписано.
То, что у меня есть пока, не так уж и много.
Любая помощь будет очень высоко ценится.
Tasks.xaml (содержащий TabView и Datagrid)
<TabView x:Name = "Tabs" AddTabButtonClick = "TabView_AddButtonClick"
TabCloseRequested = "TabView_TabCloseRequested" Loaded = "TabView_Loaded"
TabDroppedOutside = "TabView_TabDroppedOutside" CanDragTabs = "True">
<TabViewItem Header = "Tasks" IsClosable = "False">
<TabViewItem.IconSource>
<SymbolIconSource Symbol = "Home" />
</TabViewItem.IconSource>
<Grid>
<Grid>
<DataGrid:SfDataGrid x:Name = "DataGrid"
AutoGenerateColumns = "False" ItemsSource = "{Binding}"
ShowSortNumbers = "True" AllowResizingColumns = "True" AllowDraggingColumns = "True"
SelectionUnit = "Row" CellDoubleTapped = "DataGrid_CellDoubleTapped"
AllowGrouping = "True" ShowGroupDropArea = "True"
AllowFiltering = "True" FilterRowPosition = "FixedTop">
<DataGrid:SfDataGrid.Columns>
<DataGrid:GridNumericColumn MappingName = "ColumnId" HeaderText = "ID" ColumnWidthMode = "Auto" IsHidden = "True"/>
<DataGrid:GridNumericColumn MappingName = "ColumnStatus" HeaderText = "STATUS" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True"/>
<DataGrid:GridTextColumn MappingName = "ColumnTaskNr" HeaderText = "NR" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True"/>
<DataGrid:GridTextColumn MappingName = "ColumnCustomerName" HeaderText = "KUND" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True"/>
<DataGrid:GridTextColumn MappingName = "ColumnCustomT2" HeaderText = "GÄLLER" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True"/>
<DataGrid:GridTextColumn MappingName = "ColumnTask" HeaderText = "UPPDRAG" TextTrimming = "CharacterEllipsis" TextWrapping = "Wrap" ImmediateUpdateColumnFilter = "True"/>
<DataGrid:GridDateColumn MappingName = "ColumnCreatedDate" HeaderText = "SKAPAT TIDPUNKT" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True" FilterRowEditorType = "Date"/>
<DataGrid:GridNumericColumn MappingName = "ColumnPriority" HeaderText = "PRIORITET" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True"/>
<DataGrid:GridTextColumn MappingName = "ColumnCustomT1" HeaderText = "ATT GÖRA" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True"/>
<DataGrid:GridTextColumn MappingName = "ColumnCustomerRef" HeaderText = "KONTAKTPERSON" ColumnWidthMode = "Auto" ImmediateUpdateColumnFilter = "True"/>
</DataGrid:SfDataGrid.Columns>
</DataGrid:SfDataGrid>
</Grid>
</Grid>
</TabViewItem>
</TabView>
enter code here
Tasks.xaml.cs (функция, содержащая функцию, создающую новую вкладку)
private void DataGrid_CellDoubleTapped(object sender, Syncfusion.UI.Xaml.DataGrid.GridCellDoubleTappedEventArgs e)
{
this.DataGrid.SelectedIndex = this.DataGrid.ResolveToRecordIndex(e.RowColumnIndex.RowIndex);
int rowIndex = e.RowColumnIndex.RowIndex;
int columnIndex = this.DataGrid.ResolveToGridVisibleColumnIndex(e.RowColumnIndex.ColumnIndex);
var recordIndex = this.DataGrid.ResolveToRecordIndex(rowIndex);
var record1 = this.DataGrid.View.Records.GetItemAt(recordIndex);
var mappingName = this.DataGrid.Columns[columnIndex].MappingName;
string TaskNr = record1.GetType().GetRuntimeProperty("ColumnTaskNr").GetValue(record1).ToString();
TabViewItem newItem = new TabViewItem();
newItem.Header = $"{TaskNr}";
newItem.IconSource = new Microsoft.UI.Xaml.Controls.SymbolIconSource() { Symbol = Symbol.Document };
Frame frame = new Frame();
frame.Navigate(typeof(TaskDetails));
newItem.Content = frame;
Tabs.TabItems.Add(newItem);
}





Вы можете передать ViewModels каждому TabItem:
Например:
public partial class ItemViewModel : ObservableObject
{
[ObservableProperty]
private string _text = string.Empty;
}
public sealed partial class TabViewContentPage : Page
{
public TabViewContentPage()
{
this.InitializeComponent();
}
public ItemViewModel ViewModel { get; set; }
}
<Page
x:Class = "App14.TabViewContentPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:local = "using:App14"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable = "d">
<Grid>
<TextBox Text = "{x:Bind ViewModel.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Page>
private void TabView_AddButtonClick(TabView sender, object args)
{
ItemViewModel itemViewModel = new()
{
Text = $"{TabViewControl.TabItems.Count}",
};
TabViewContentPage tabViewContentPage = new()
{
ViewModel = itemViewModel,
};
Frame frame = new()
{
Content = tabViewContentPage,
};
TabViewItem newTabViewItem = new()
{
Header = "New Tab",
Content = frame,
};
this.TabViewControl.TabItems.Add(newTabViewItem);
}
Мне удалось заставить его работать, но я не уверен, что я сделал. Большое спасибо, это решение сработало отлично.
Спасибо за ответ, я пробую это решение, но получаю сообщение: Не удалось найти тип или имя пространства имен «ObservableObject». Где он находится? Я использую .net 6. Я также добавил System.Collections.ObjectModel.