wpf datagrid中包含自定义数据的新行

bnlyeluc  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(121)

我有两个数据网格。第一个是关于时间跟踪的概述。第二个显示一些细节。
例如:第一个数据网格包含雇员工作的每一天。第二个数据网格包含一天的时间戳。
但是,当我添加新的戳记行时,datagrid中的控件为空。这实际上不是问题,但日期选择器显示的日期为01/01/0001。
我想要的是,当我添加新行时,日期字段应该用第一个数据网格中的日期填充。
检视:

<DataGrid Grid.Column="0"
                      IsReadOnly="True"
                      AutoGenerateColumns="False"
                      Grid.Row="0"
                      x:Name="DgStundenView"
                      Margin="0 0 10 0"
                      SelectedItem="{Binding SelectedItem}"
                      ItemsSource="{Binding TimeOverviewList}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Wochentag" Binding="{Binding Wochentag}" />
                <DataGridTextColumn Header="Datum" Binding="{Binding Tag}" />
                <DataGridTextColumn Header="Arbeitszeit Soll" Binding="{Binding ArbeitszeitInStunden}" />
                <DataGridTextColumn Header="Arbeitszeit gesamt" Binding="{Binding GesamtDauerInStunden}" />
                <DataGridTextColumn Header="Pausenzeit" Binding="{Binding Pausenzeit}" />
                <DataGridTextColumn Header="Pausendifferenz" Binding="{Binding PausenDifferenzInStunden}" />
                <DataGridTextColumn Header="Arbeitszeit inkl. Pause" Binding="{Binding TatsaechlicheDauerInStunden}" />
                <DataGridCheckBoxColumn Header="Status" Binding="{Binding StempelungVorhanden,Mode=OneWay}" />
                <DataGridTextColumn Header="Info" Binding="{Binding Info}" />
            </DataGrid.Columns>

            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Wochentag}" Value="Sa">
                            <Setter Property="Background" Value="LightGray" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Wochentag}" Value="So">
                            <Setter Property="Background" Value="LightGray" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
        </DataGrid>

        <DataGrid Grid.Column="0"
                  Grid.Row="1"
                      x:Name="DgStempelungen"
                      Margin="0 10 10 0"
                      AutoGenerateColumns="False"
                  CanUserAddRows="True"
                  SelectedItem="{Binding SelectedValue}"
                  ItemsSource="{Binding TimeDetailList}">

            <DataGrid.Resources>
                <x:Array x:Key="Reasons" Type="system:String">
                    <system:String>NICHT ANWENDBAR</system:String>
                    <system:String>KRANK</system:String>
                    <system:String>GANZER TAG URLAUB</system:String>
                </x:Array>
            </DataGrid.Resources>

            <DataGrid.Columns>

                <DataGridTextColumn Header="ID" IsReadOnly="True" Binding="{Binding  Id}"/>
                <DataGridTemplateColumn Header="KOMMEN DATUM">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding  ComeBooking}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="KOMMEN UHRZEIT">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <materialDesign:TimePicker Text="{Binding ComeBookingTime, StringFormat=t}"
                                                       Is24Hours="True">
                            </materialDesign:TimePicker>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="GEHEN DATUM">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding GoBooking}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="GEHEN UHRZEIT">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <materialDesign:TimePicker Text="{Binding GoBookingTime, StringFormat=t}"
                                                       Is24Hours="True">
                            </materialDesign:TimePicker>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridComboBoxColumn Header="GRUND"
                                        ItemsSource="{StaticResource Reasons}"
                                        TextBinding="{Binding Info}"/>
            </DataGrid.Columns>
</DataGrid>

查看型号

[CanBeNull] private ClassTimeTrackingDayStamp _selectedItem;

[CanBeNull]
public ClassTimeTrackingDayStamp SelectedItem
{
    get { return _selectedItem; }
    set
    {
        _selectedItem = value;
        OnPropertyChanged();
        if (_selectedItem != null)
            TimeDetailList = new ObservableCollection<ClassTimeTrackingTimeStamp>(_selectedItem.Stempelungen);
    }
}

private ObservableCollection<ClassTimeTrackingDayStamp> _timeOverviewList;

public ObservableCollection<ClassTimeTrackingDayStamp> TimeOverviewList
{
    get { return _timeOverviewList; }
    set
    {
        _timeOverviewList = value;
        OnPropertyChanged();
    }
}

[CanBeNull] private ObservableCollection<ClassTimeTrackingTimeStamp> _timeDetailList;

[CanBeNull]
public ObservableCollection<ClassTimeTrackingTimeStamp> TimeDetailList
{
    get { return _timeDetailList; }
    set
    {
        _timeDetailList = value;
        OnPropertyChanged();
    }
}

产品型号

public class ClassTimeTrackingTimeStamp : ViewModelBase
{
    public DateTime ComeBooking { get; set; }

    public DateTime GoBooking { get; set; }

    public TimeSpan ComeBookingTime { get; set; }
    public TimeSpan GoBookingTime { get; set; }

    public int Id { get; set; }

    public string Info { get; set; }
}

更新

MVVM视图上的事件

<DataGrid Grid.Column="0"
                  Grid.Row="1"
                      x:Name="DgStempelungen"
                      Margin="0 10 10 0"
                      AutoGenerateColumns="False"
                  CanUserAddRows="True"
                  SelectedItem="{Binding SelectedValue}"
                  ItemsSource="{Binding TimeDetailList}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="AddingNewItem">
                    <i:InvokeCommandAction Command="{Binding Path=AddNewItemCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
             ...

查看型号

public ICommand AddNewItemCommand { get; set; }

#endregion Properties

#region Events

public event EventHandler AddNewItemEventHandler;

#endregion

#region Constructor

public WTimeClockOverviewVM()
{
    AddNewItemCommand = new RelayCommand(o =>
    {
        this.AddNewItemEventHandler?.Invoke(this, EventArgs.Empty);
    });
}

代码背后

public WTimeClockOverview()
{
    InitializeComponent();

    var vm = (WTimeClockOverviewVM)DataContext;

    if(vm == null) return;
    vm.AddNewItemEventHandler += (sender, args) =>
    {
        var selectedItemInFirstDg = vm.SelectedItem;

        if (selectedItemInFirstDg != null)
        {
            var newItem = new ClassTimeTrackingTimeStamp();
            newItem.ComeBooking = selectedItemInFirstDg.Tag;
        }
    };
}

谢谢你的帮助:)
最好的问候Levin

yhived7q

yhived7q1#

在第二个DataGrid中,您可以订阅AddingNewItem事件

<DataGrid x:Name="DgStempelungen" 
          AddingNewItem="DgStempelungen_OnAddingNewItem"
          ...

在程式码后置中

private void DgStempelungen_OnAddingNewItem(object sender, AddingNewItemEventArgs e)
{
    // I'll assume that the Model's Name in first DataGrid collection is StudentItem!
    var selectedItemInFirstDg = DgStundenView.SelectedItem as StudentItem;
    // or you can get the selected item from the DataContext:
    // (DgStundenView.DataContext as MyViewModel)?.SelectedItem;
    if (selectedItemInFirstDg != null){
       // create the new row with data from selectedItemInFirstDg, ex. date, etc...
       e.NewItem = new ClassTimeTrackingDayStamp
       {
            ComeBooking = selectedItemInFirstDg.Date; // for example
       };
    }
}

相关问题