0

DataGridTextColumnsを列ごとに配列にバインドしようとして(int []だと思います)、失敗しました。msdn、stackoverflowなどで私が見つけたものは特に役に立ちませんでした。

<DataGrid AutoGenerateColumns="False" VerticalAlignment="Top" Margin="0,47,0,0" Height="351" Name="dataGrid1" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Slave Address" Width="100" Binding="{Binding SlaveAddressValues}"/>
        <DataGridTextColumn Header="Meter Readings" Width="100" Binding="{Binding MeterReadingValues}"/>
    </DataGrid.Columns>
</DataGrid>

代わりにdatagridを使用してバインディングを配置したり、datagridtextcolumns(itemsourceなど)を使用したり、コードでdatacontextを定義したり(mvvmの理由でコードからできるだけ除外したい)、パスを使用したりするなど、さまざまなことを試しました。とソース、そしてクラスで私の2つの配列を結合しようとしています(これはとにかく私が本当に望んでいることではありません)。ただし、次の単純なテストケースでさえ、データグリッドと適切にバインドするために何も機能していません。

private int[] SlaveAddressValues = { 0, 0, 0, 0 };
private int[] MeterAddressValues = { 2, 2, 2, 3 };

誰かアイデアがありますか?

そうですね、ここに解決策を入れるべきだったのかもしれませんが、少し長かったので答えとして入れました。それはとにかく多くの方法の1つなので、気が向いたら別の回答を投稿してください。

4

4 に答える 4

2

単一のソースにバインドする必要があります

class  Address
{
    public Int Slave { get; set; }
    public Int Meter { get; set; }
}

作成

Public List<Address>  Addresses { get; set; }

DataGridをAdddressにバインドします

次に、列でパスをスレーブとメーターにバインドします

于 2012-11-06T13:09:02.030 に答える
2

まず、プライベートフィールドにバインドできない場合は、それらをパブリックプロパティにする必要があります。

private int[] _slaveAddressValues = { 0, 0, 0, 0 };

public int[] SlaveAddress 
{
    get { return _slaveAddressValues; }
    set { _slaveAddressValues = value; }
}

(プロパティ設定の通知を省略していることに注意してください。)

2番目の問題は、DataColumnをこのように継承されたデータコンテキストの独立したプロパティにバインドするべきではないということです-グリッドのItemsSourceにバインドしたIEnumerableに含まれるアイテムのプロパティにバインドする必要があります。これが別のサンプルです。

うまくいけば、これらのリンクが何らかの助けになるでしょう、少なくともあなたが始めるのに役立つはずです。

于 2012-11-06T13:07:00.600 に答える
1

そうです、あなたの答えに感謝します。これが私が最終的にそれを解決した方法です:

public List<Address> Addresses = new List<Address>();

私のメインクラスで

dataGrid1.DataContext = Addresses;

メインクラスへのエントリメソッド

for(int i=0; i<10; i++)
{
    Addresses.Add(new Address(){Meter = "",Slave = i});
}

for (int i = 0; i < 10; i++)
{
    Addresses[i].Meter = Convert.ToString(i);
}

私の入力方法では、このリストに簡単にデータを入力して編集できることを示しています

   public class Address
{
    public int Slave { get; set; }
    public string Meter { get; set; }

    public Address()
    {
    }
}

そしてこれは私が明らかに必要とした追加のクラスとして上記

と:

<DataGrid Name="dataGrid1" ItemsSource="{Binding}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Slave Address" Binding="{Binding Path=Slave}"/>
                <DataGridTextColumn Header="Meter Readings" Binding="{Binding Path=Meter}"/>
            </DataGrid.Columns>
        </DataGrid>
于 2012-11-06T14:22:19.853 に答える
0

WPFは、オブジェクトのビューに物事を表示する方法がない場合に非常に役立つものを紹介します。コンバーターを使用できます。このコンバーターシステムは、あなたが望む方法で微調整するのに役立つと確信しています。

配列を取り、連結されたアイテムの文字列のようなものを返すコンバーターを作成します。また、表示値からオブジェクトに逆変換します。両側の同期用。

于 2012-11-06T13:23:52.837 に答える