マスター詳細スキーマにはすでに 2 つのクラスがあり、
マスタークラスには詳細マスターのコレクションがあり、すべての粗いオプションをインラインで実行する必要があります (したい)。
クラス:
public partial class Items
{
public Items()
{
this.Detail = new HashSet<Detail>();
}
public decimal NumIdConcepto { get; set; }
public string StrDescripcionConcepto { get; set; }
public virtual ICollection<Detail> Detail { get; set; }
}
public partial class Detail
{
public int IntTipoAsociado { get; set; }
public decimal NumIdConcepto { get; set; }
public virtual Items Items { get; set; }
public virtual Master Master { get; set; }
}
public partial class Master
{
public Master()
{
this.Detail = new HashSet<Detail>();
}
public int IntTipoAsociado { get; set; }
public string StrDescripcionTipoAsociado { get; set; }
public virtual ICollection<Detail> Detail { get; set; }
}
編集目的と EF ジェネレーターの制限のために、Master の Detail コレクションのためにHashSetからObservableCollectionへの変換を実行する必要があります
public class listToObservableCollection : BaseConverter, IValueConverter
{
public HashSet<Detail> JustForPath { get; set; }
public ObservableCollection<Detail> JustForPathObservable { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
HashSet<Detail> observableList = (HashSet<Detail>)value;
JustForPathObservable = new ObservableCollection<Detail>(observableList);
return JustForPathObservable;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
JustForPath = (HashSet<Detail>)value;
return JustForPath;
}
}
public abstract class BaseConverter : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
この構造を使用して、DataGrid を生成して、詳細を追加、削除、および編集できるようにしたい インラインで、別のフォームを呼び出したくない
このような:
私の XAML コードは次のようになります。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModels="clr-namespace:Contratos.ViewModels" x:Class="Contratos.Views.TipoAsociado"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF45"
xmlns:l="clr-namespace:Recursos;assembly=Recursos"
Title="{Binding Title}" Height="Auto" Width="Auto">
<Window.DataContext>
<ViewModels:TipoAsociadoVM/>
</Window.DataContext>
<Window.Resources>
<l:listToObservableCollection x:Key="listoToObservable"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="1"
ItemsSource="{Binding Master}"
AutoGenerateColumns="False"
SelectionMode="Single"
GridLinesVisibility="Vertical"
CanUserAddRows="True"
CanUserDeleteRows="True"
x:Name="GridTipoAsociado"
Margin="5" SelectionChanged="GridTipoAsociado_SelectionChanged">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding _ICommandSelectionChange}"
PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Description" x:Name="Description">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding StrDescripcionTipoAsociado}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding StrDescripcionTipoAsociado }"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid Grid.Row="1"
ItemsSource="{Binding Path=Detail,Converter={StaticResource listoToObservable},Mode=TwoWay}"
DisplayMemberPath="StrDescripcionConcepto"
AutoGenerateColumns="False"
IsSynchronizedWithCurrentItem="True"
SelectionMode="Single"
SelectionUnit="Cell"
GridLinesVisibility="Vertical"
CanUserAddRows="True"
CanUserDeleteRows="True"
x:Name="GridItems"
Margin="20,5,5,5">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Items">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Items.StrDescripcionConcepto}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!--
Here is my problem How can i to bind to the propper values to perform Editing
Without having this exception "TWO WAY BINDING REQUIRES PATH OR XPATH" when try to update DETAIL items:
-->
<TextBox Text="{Binding Items.StrDescripcionConcepto}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
</Window>
今、必要なすべての変更を編集できるように、適切な CellEditingTemplate を作成する方法について助けが必要ですか?
DETAIL項目を更新しようとしたときに、この例外「TWO WAY BINDING REQUIRES PATH OR XPATH」が発生することなく、編集を実行するためにプロッパー値にバインドするにはどうすればよいですか?
注:新しいアイテムを作成したくありません。ここでは、詳細に添付するだけです。