0

単純なデータベース(.sdf)をコンボボックスにバインドする方法を学習しようとしています。テーブルを含むデータセットを作成しました。次に、テーブルをデータソースからコントロールにドラッグしました。ビルドの警告/エラーはなく、実行するとComboBoxは空になります。

<UserControl x:Class="OurFamilyFinances.TabItems.TransactionTab"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="414" d:DesignWidth="578" xmlns:my="clr-namespace:OurFamilyFinances" Loaded="UserControl_Loaded_1">
<UserControl.Resources>
    <my:FinancesDataDataSet x:Key="financesDataDataSet" />
    <CollectionViewSource x:Key="accountViewSource" Source="{Binding Path=Account, Source={StaticResource financesDataDataSet}}" />
</UserControl.Resources>
<Grid>
    <ComboBox DisplayMemberPath="Name" Height="23" HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource accountViewSource}}" Margin="3,141,0,0" Name="accountComboBox" SelectedValuePath="ID" VerticalAlignment="Top" Width="120">
        <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </ComboBox.ItemsPanel>
    </ComboBox>
</Grid>

表示されているパスは正しく、selectedPathは「ID」、displaypathは「Name」です。Linq to Sqlでこれを行うと、コンボボックスにデータが入力されます。

   this.accountComboBox.ItemsSource = from o in db.Account
                                           select new { o.ID, o.Name };

しかし、XAMLでこれを行う方法を学びたいと思います。データソースからもデータグリッドをドラッグしましたが、どちらも入力されていません。何か案が?

4

3 に答える 3

1

他の人に役立つ場合-私はこれに遭遇しました。この場合、デザイナーを使用して(DataSetからテーブルをドラッグするなど)、バインドされたリストボックスをページコントロールに追加しようとしました。

メインウィンドウで代わりに試すための上記のヒントは機能しましたが、少し詳しく調べてみると、その理由がわかります。

設計者の欠陥のようです。生成されたXAMLに加えて、ウィンドウにコントロールを追加すると、Window_Loaded内にテーブルを設定するためのコードのblobも生成されます。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    AdventureWorksLTDataSet = ((AdventureWorksProductsEditor.AdventureWorksLTDataSet)(this.FindResource("adventureWorksLTDataSet")));
    // Load data into the table Product. You can modify this code as needed.
    adventureWorksLTDataSetProductTableAdapter = new AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter();
    adventureWorksLTDataSetProductTableAdapter.Fill(AdventureWorksLTDataSet.Product);
    productViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("productViewSource")));
    productViewSource.View.MoveCurrentToFirst();
}

http://msdn.microsoft.com/en-us/library/dd547149.aspxを参照してください)

ただし、コントロールが別のページコントロールに追加された場合はそうしませんでした。また、OPのレポートに基づいて、UserControlなどでもそうしなかったと思われます。

したがって、生成されたコードを使用してテーブルにデータを入力するための迅速で汚い回避策は、ウィンドウで1回実行してから、Window_Loadedからコードを取得し、元に戻してx_Loadedに接続し、他のコントロールに接続することです。バインドされたコントロールを追加します。

于 2014-04-11T21:56:30.217 に答える
0

.sdfファイルを完全に新しいプロジェクトにプルし、DataSetを再生成して、ComboBoxをウィンドウにドラッグしました。それはうまくいきます!

次に、このプロジェクトと前回のプロジェクトの違いは、コントロールがUserControlにあることです。コンボボックスを使用してユーザーコントロールを追加し、コンパイルしました。UserControlのコンボボックスは空で、メインウィンドウのComboBoxは正しく入力されています。

于 2010-05-01T22:03:30.803 に答える
0

さて、この答えは私の前の答えよりもはるかに優れています。Window.xamlファイルで、次のように正しいコンテキストをコントロールに送信する必要があります。

      <my:UserControl1 HorizontalAlignment="Left" Margin="12,12,0,0" x:Name="userControl11" VerticalAlignment="Top" DataContext="{Binding  Source={StaticResource accountViewSource}}" />

UserControlがコンテキストを認識したので、UserControl.xamlから他のコンテキスト変更コードを削除し、コンテキストを直接使用します。

<UserControl x:Class="test3.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300" xmlns:my="clr-namespace:test3" Loaded="UserControl_Loaded">
  <Grid >
    <ComboBox DisplayMemberPath="Name" Height="23" HorizontalAlignment="Left" ItemsSource="{Binding}" Name="accountComboBox" SelectedValuePath="ID" VerticalAlignment="Top" Width="120">
      <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
          <VirtualizingStackPanel />
        </ItemsPanelTemplate>
      </ComboBox.ItemsPanel>
    </ComboBox>
  </Grid>
</UserControl>

そして、それはそれを行う必要があります。

于 2010-05-01T22:57:03.653 に答える