1

コンテキスト: 私は EF 5 を使用しており、2 つのエンティティを WPF フォームにバインドしようとしています。単純なプロパティからテキスト ボックスへのバインディングでは問題なく動作しますが、ナビゲーション プロパティ オブジェクトをコンボボックスにバインドしたいと考えています。私はWPFを学んでいるので、これは明らかかもしれません。

2 つの EF エンティティがあります。

Product { int Id, string Name, Category Category }

Category { int Id, string Description }

製品を作成および編集するための WPF フォームを作成しました。これは次のようなものです (簡略化)。

        <Window.Resources>
            <CollectionViewSource x:Key="productViewSource" d:DesignSource="{d:DesignInstance my:product, CreateList=True}" />
            <CollectionViewSource x:Key="categoryViewSource" d:DesignSource="{d:DesignInstance my:category, CreateList=True}" />
        </Window.Resources>
        <Grid DataContext="{StaticResource productViewSource}">
            <Label Content="Id" Height="28" HorizontalAlignment="Left" Margin="6,6,0,0" Name="label1" VerticalAlignment="Top" />
            <TextBox Height="23" HorizontalAlignment="Left" Margin="61,8,0,0" Name="txtId" Text="{Binding Path=Id, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Top" Width="56" IsEnabled="False" />
            <Label Content="Name" Height="28" HorizontalAlignment="Left" Margin="6,38,0,0" Name="label2" VerticalAlignment="Top" />
            <TextBox Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" Height="23" HorizontalAlignment="Left" Margin="61,40,0,0" Name="txtNome" VerticalAlignment="Top" Width="183" IsEnabled="False" />

            <Label Content="Category" Height="28" HorizontalAlignment="Left" Margin="6,129,0,0" Name="label5" VerticalAlignment="Top" />
            <ComboBox Height="23" HorizontalAlignment="Left" Margin="72,132,0,0" Name="comboCategory" VerticalAlignment="Top" Width="172" 
                      DisplayMemberPath="Description" 
                      SelectedValuePath="Id" 
                      SelectedValue="{Binding Path=Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      ItemsSource="{Binding Path=categoryViewSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
            </ComboBox>
         </Grid>

2 つのビュー ソースをロードするコードは次のとおりです。

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        context = new DBEntities();

        var productViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("productViewSource")));
        context.Product.Include(p => p.Category);
        context.Product.Load();
        ProductViewSource.Source = context.Product.Local;

        var categoryViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("categoryViewSource")));
        categoryViewSource.Source = context.Category.ToList();
    }

ウィンドウが読み込まれると、2 つのテキスト ボックスが機能しますが、コンボ ボックスは常に空です。

おそらくこれが間違っているのですが、それを機能させる方法が見つからないようです。

ItemsSource="{Binding Path=categoryViewSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
4

1 に答える 1

2

これは間違っています:

ItemsSource="{Binding Path=categoryViewSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">

ここで WPF に伝えていることは、Visual Tree で最初に遭遇したものから上に向かってプロパティが必要であるということです。 もちろん、クラスにはそのようなプロパティはありません。categoryViewSourceWindowWindow

そのはず:

ItemsSource="{StaticResource categoryViewSource}">

その名前(キー)でリソースを検索することをWPFに伝えます

編集:データを保持する ViewModel を作成することをお勧めします。

public class ViewModel: INotifyPropertyChanged
{
     public List<Category> Categories {get;set;} //Don't forget INotifyPropertyChanged!!

     //... other properties
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    context = new DBEntities();

    var vm = new ViewModel() { Categories = context.Category.ToList(); }

    DataContext = vm;
}

XAML:

<ComboBox ItemsSource="{Binding Categories}"/>

静的リソースを削除し、それらへのすべての参照を削除します。

編集2:

SelectedValuePathAndSelectedValueプロパティは連携して機能します。はSelectedValuePathComboBox に「各アイテム内でこのプロパティを評価する」ことを伝えており、SelectedValueプロパティはそのプロパティで見つかると予想される実際の値であるため、次のようになります。

<ComboBox SelectedValuePath="Id" SelectedValue="{Binding Category}"/>

エンティティのいずれかと一致する値が含まれていると予想される DataContext クラスでint呼び出されたプロパティがあることを WPF に伝えています。CategoryId

ここで実際に行う必要があるのは次のとおりです。

ビューモデル:

public Category Category {get;set;} //Don't forget INotifyPropertyChanged!!!

XAML:

<ComboBox SelectedItem="{Binding Category}"/>

SelectedValuePath と SelectedValue の両方を削除します。

于 2013-02-04T21:57:50.377 に答える