0

マスター詳細スキーマにはすでに 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」が発生することなく、編集を実行するためにプロッパー値にバインドするにはどうすればよいですか?

注:新しいアイテムを作成したくありません。ここでは、詳細に添付するだけです。

4

2 に答える 2

0

「TWO WAY BINDING REQUIRES PATH OR XPATH」というエラーは、バインディング パスが正しくない場合にもスローされる可能性があります。たとえば、プロパティの名前が "DisplayName" であるが、XAML バインディング式で "Name" を使用している場合です。

この場合、探している場合は、[出力] ウィンドウで VS デバッガーから追加情報を取得することもできます。または、私のように、そこを見ることを覚えていない場合は、インターネットを探し回って半日を費やしてから、仮定を立ててからタイプミスをしたことに気付くかもしれません。

したがって、私の場合、このエラーはバインディング パスが正しくないことを意味していました。おそらく、パスが欠落しており、それを指定する必要があります (したがって、豊富なBinding Path=. vs.Bindingアドバイス)。または、タイプミスをして、プロパティ名に関する仮定を再確認する必要があるかもしれません。

ルール #1 と WPF バインディングのデバッグ。その出力ウィンドウは常に開いたままにしてください。

于 2015-11-03T14:43:09.547 に答える