0

リストビューを持つ .xaml ファイルがあります。Listview には、次の方法でバインドされる 2 つの項目が含まれています。

<ListView  Name="listView" ItemsSource="{Binding DeviceList}" SelectedItem="{Binding ConnectedDevice, Mode=TwoWay}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="300" Header="Name" DisplayMemberBinding="{Binding Description}" />
                <GridViewColumn Width="240" Header="Connection Status" DisplayMemberBinding="{Binding DeviceName}" />
            </GridView>
        </ListView.View>
    </ListView>

DescriptionDevicenameはどちらもModelClassの一部です。私の ViewModel クラスでは、接続したハードウェアから Device name と Description を抽出できます。

    public ObservableCollection<ComDeviceInfo> DeviceList
    {
        get { return comDevices; }
        set
        {
            comDevices = value;
            NotifyPropertyChanged("DeviceList");
        }
    }

    public ComDeviceInfo ConnectedDevice
    {
        get { return connectedDevice; }
        set
        {
            connectedDevice = value;
            NotifyPropertyChanged("ConnectedDevice");
        }
    }        

    //Called Inside Constructor
    private void checkForDevicesTimer_Elapsed(Object source, ElapsedEventArgs e)
    {            
        DeviceList = ComDeviceManagement.FindDevices();            
    }

ここでComDeviceManagementは、デバイス名と説明を返すFINDDevices()を持つクラスです。上記の DeviceList = ComDeviceManagement.FindDevices() は、説明と名前の両方がリスト内に存在することを示しています。

すべてが正常に機能しています。しかし、私が基本的に望んでいるのは、デバイス名と説明の両方を 2 つの別々の列ではなく 1 つの列に表示することです。ここで私が直面している問題は、Devicename と Description にあります。どちらも異なる値を表示しますが、それらを連結して両方の値を単一の列に表示できる方法ではありませんか? .xaml ファイルに別の列があることに気付くかもしれませんが、listView の単一の列内にこれらの両方を表示 (連結) したいと考えています。どうやってやるの?

助けてください!!

4

4 に答える 4

5

フォーマット文字列でMultiBindingを使用します。

<GridViewColumn>
    <TextBlock>
        <!-- the Text property is of type System.String -->
        <TextBlock.Text>
            <MultiBinding StringFormat="{0} {1}">
                <Binding Path="Description "/>
                <Binding Path="Name"/>
             </MultiBinding>
         </TextBlock.Text>
     </TextBlock> 
</GridViewColumn>

MultiBindingで理解する必要があるのは、ターゲットプロパティが文字列でない場合は、コンバーターを提供する必要があるということです。文字列の場合は、フォーマット文字列を使用するだけで問題を解決できます。

したがって、あなたの場合、DisplayMemberBindingを介して(簡単に)使用することはできません。上記の例のようにコンテンツを指定する必要があります。

于 2012-09-27T12:43:33.147 に答える
4

2 つのアプローチ

ComDeviceInfo クラスでは、連結するプロパティを追加するだけです

  public string DescName 
  {
      get 
      {
           return Description + " " + Name;
      }
  {

<GridViewColumn Width="300" Header="Name" DisplayMemberBinding="{Binding DescName}" />

または、多値コンバーターを使用します

MultiBinding.Converter

例を示します。

于 2012-09-27T12:25:38.807 に答える
2

新しいプロパティを追加しますが、コンポーネントが変更されたときにも更新することを忘れないでください。

 private ComDeviceInfo _model;

 public string DeviceName
 {
     get { return _model.Name; }
     set
     {
         _model.Name = value;
         NotifyPropertyChanged("DeviceName");
         NotifyPropertyChanged("Combined");
     }
 }
 public string Description
 {
     get { return _model.Description; }
     set
     {
         _model.Description = value;
         NotifyPropertyChanged("Description");
         NotifyPropertyChanged("Combined");
     }
 } 
 public string Combined
 {
     get { return string.Format("{0} : {1}", _description, _deviceName; }
 }
于 2012-09-27T12:44:04.620 に答える
0

LINQ クエリを使用してデータを取得している場合は、次のことができます。

var query = from devices in DeviceList
            select new
            {.DeviceDesc = devices.device + " " devices.desc}

listview.ItemsSource = query;

次に、GridView.Column に入り、次を使用します。

DisplayMemberBinding="{Binding DeviceDesc}" 

作成したばかりの連結列をバインドします。明らかに、正しいクエリを作成する必要があります。私のものは単なる例です...

于 2016-09-06T05:52:23.727 に答える