1

WPF アプリケーションを作成しようとしています。アプリケーションは、データベースへのクエリの結果を表示するために「リスト ビュー」を使用する必要があります。アプリケーション (GUI、データベース、LINQ など) を正常に作成できましたが、クエリ結果の表示がより「グリッド」に見えます。

以下のプロジェクトの仕様は、結果に表示される各レコードの横に緑色の円のアイコンが必要であることを示しています。データベースの内容を非公開にするために、以下の画像から実際の結果を削除しました。

画像を投稿するのに十分な評判ポイントがないので、私が使用するサンプル/テスト ドメインとして写真を投稿しました。WPF アプリのスクリーンショットとコードは次の場所にあります。

http://digitalworkzone.com/WPF.html

私は間違って何をしていますか? クエリ結果を表示するために緑色の円と「リスト」スタイルを取得できるようにするために、コードに追加または変更する必要があるものはありますか?

4

2 に答える 2

2

WPF コンテンツ モデルを理解します。http://msdn.microsoft.com/en-us/library/bb613548.aspx

「コンテンツ」プロパティを持つものは、基本的に 2 つの方法で動作します。「コンテンツ」がから派生したものに設定されているUIElement場合、クラスは独自のプレゼンテーションを管理します。ただし、それ以外のものは.ToString()呼び出されるだけで、代わりにテキストが表示されます。

これが長期的に意味することは、WPF のすべてが何でも表示できるということです。ボタンにボタンを表示したい場合は、できます。例えば:

<Button>
    <Button.Content>
        <Button Content="This will show as text" />
    </Button.Content>
</Button>

内側のボタンにはテキストがありますが、外側のボタンには a が表示されButtonます。ButtonUIElement

上記の画像の例では、グラフィック情報を入力したいListBoxes/があります。DataGridこれを試してください:

<ListBox HorizontalContentAlignment="Stretch">
    <ListBox.Items>
        <Button Content="One"/>
        <Button Content="Two"/>
        <Button Content="Three"/>
        <Button Content="Four"/>
    </ListBox.Items>
</ListBox>

Buttonsこれで、Text の代わりに表示される ListBox ができました。これをさらに一歩進めて、アイテムをスタックパネルに含めることができます。次に例を示します。

<ListBox HorizontalContentAlignment="Stretch">
    <ListBox.Items>
        <StackPanel Orientation="Horizontal">
            <Button Content="A button"/>
            <Label Content="Some text" />
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Button Content="A button"/>
            <Label Content="Some text" />
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Button Content="A button"/>
            <Label Content="Some text" />
        </StackPanel>
    </ListBox.Items>
</ListBox>

これで、レイアウト コンテナーを含む項目ができました (StackPanelsには、他の要素が含まれます)。

ただし、を別のItemsSource場所に設定すると、実際には a を使用しDataTemplateてコンテンツを表示できます。ADataTemplateは事実上、特定のクラスを対象とし、XAML で定義されているようにその内容をレイアウトします。検討:

コードビハインド:

public partial class MyWindow : UserControl {
    public MyWindow() {
        InitializeComponent();

        MyListBox.ItemsSource = new List<Person> {
            new Person("Sam", "Smith"),
            new Person("Jim", "Henson"),
            new Person("Betty", "White"),
        };

    }

XAML:

    <ListBox HorizontalContentAlignment="Stretch" x:Name="MyListBox" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" >
                    <Label Content="{Binding FirstName}"/>
                    <Label Content="{Binding LastName}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Listbox が表示されると、ItemsSourceプロパティ内の各項目が順番に表示され、DataTemplate を使用してそれらが配置されます。DataTemplateポリモーフィズムを使用している場合は、プロパティを使用してターゲット固有のクラスを持つことがDataTypeできます (すべて ' から派生する '顧客' や '従業員' などのさまざまなタイプの人々のようにPerson)。

このアプローチの問題点は、アイテムの値を直接設定していることです。これは悪い形式です。ビューのすべてのデータを個別に処理するクラスを定義することをお勧めします。検討:

public class ViewModel {

    // WPF will automatically read these properties using reflection.
    public List<Person> People {
        get {
            return new List<Person> {
                new Person("Sam", "Smith"),
                new Person("Jim", "Henson"),
                new Person("Betty", "White")
            };
        }
    }
}

ビューのすべてのデータが保持されます。実際のウィンドウに追加しましょう。まず、名前空間を参照する必要があります (「xmlns」は xml 名前空間を意味します)。

<Window x:Class="Sharp.MyWindow"
    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" 

    xmlns:lol="clr-namespace:Sharp">

名前空間はSharp(私のものが存在する名前空間) であり、それに与えるエイリアスは ですlol。次のように、クラスをプロパティにViewModel設定して、クラスをウィンドウにアタッチします。DataContext

<Window>
    <Window.DataContext>
        <lol:ViewModel />
    </Window.DataContext>
</Window>

これにより、クラスのすべてのパブリック プロパティが で使用できるようになります。このように、情報をに読み込みたい場合は、単に次のように言います。ViewModelWindowPersonsListBox

<ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding People}" >
   ...
</ListBox>

ということに注意してください。これは、 「People」と呼ばれるパブリック プロパティをItemsSource={Binding People}スキャンし、それらの結果を取得することを意味します。ViewModelこれは本質的に、MVVM アプローチの背後にある基本です。でメインのアプリケーション操作を処理する 1 つまたは複数のクラスにすべてのビジネス ロジックを含めるModelことができますが、ViewModelとやり取りしてModel結果をパブリック プロパティとして公開する があります。WPF は自動的にこれらのプロパティにバインドし、それらを表示します。強制的に値を設定するのではなく、情報が流れるだけです。

WPF がどのように機能するかを本当に理解するには、MVVM の基本を理解するのに時間がかかります。WPF は実際には MVVM を念頭に置いて設計されているため、WPF がどのように機能するかを実際に理解するには、時間をかけて理解する必要があります。http://agilewarrior.wordpress.com/2011/01/11/simple-mvvm-walkthrough-part-i/をご覧ください 。

于 2013-07-19T20:13:45.937 に答える
1
<ListBox ItemsSource="{Binding QueryResults}">
  <ListBox.ItemsTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal">
        <Image Source="{Binding ImageSource}"/>
        <TextBlock Text="{Binding TextSource}"/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemsTemplate>
</ListBox>

QueryResultsコードビハインドで名前が付けられたオブジェクトのリストがある場合に機能します。各オブジェクトには、 という名前ImageSourceの文字列プロパティと という名前の文字列プロパティが必要TextSourceです。

ただし、各項目に緑色の円のアイコンを表示するだけでよいため、画像ソースをハードコーディングできます。ただし、それぞれに異なるアイコンが必要な場合は、上記が機能します。

DataContextまた、これを機能させるには、ウィンドウの をに設定する必要があることに注意してください。DataContext="{Binding RelativeSource={RelativeSource Self}}"

于 2013-07-19T20:20:50.503 に答える