2

intIDとListTargetsの2つのパブリックプロパティを持つ単純なObservableコレクションがあります。コードビハインドは次のようになります(不要で関連性のないコードを削除するための簡略化されたコード):

public class MyClass
{
   public ObservableCollection<SomeClass> jobs;

   public class SomeClass
   {
      private int id;
      private List<string> targets;

      public int ID
      {
         get { return id; }
         set { id = value; }
      }

      public List<string> Targets
      {
         get { return targets; }
         set { targets = value; }
      }

      public SomeClass(int _id, List<string> _targets)
      {
         id = _id;
         targets = _targets;
      }
   }

   public MyClass()
   {
      InitializeComponent();
      jobs = new ObservableCollection<SomeClass>();
      myListView.ItemsSource = jobs; //jobs is populated from a a loader in Window_Loaded
   }
}

xamlのListViewとバインディングは次のようになります。

  <ListView Name="MyListView" ItemsSource="{Binding Path=jobs, RelativeSource={RelativeSource AncestorType=Window},
            Mode=OneWay}" Width="480" Height="155" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,35,10,0" >
     <ListView.ContextMenu>
        <ContextMenu Name="contextMenuJobRemove">
           <ContextMenu.BitmapEffect>
              <OuterGlowBitmapEffect />
           </ContextMenu.BitmapEffect>
           <MenuItem Header="Remove" Click="contextMenuJobRemove_Click" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Parent}"/>
        </ContextMenu>
     </ListView.ContextMenu>
     <ListView.View>
        <GridView AllowsColumnReorder="True" ColumnHeaderToolTip="Broadcast call targets">
           <GridViewColumn DisplayMemberBinding="{Binding Path=ID}"   Header="ID"      Width="50" />
           <GridViewColumn DisplayMemberBinding="{Binding Path=Targets}" Header="Targets" Width="100" />
        </GridView>
     </ListView.View>
  </ListView>

したがって、ListViewが表示されると、Targets列には「(Collection)」が正しく表示されます。理想的には、この列に。のようなものを表示したいと思いますString.Join(",", Targets.ToArray())。これはどのように行うことができますか?xamlまたは分離コードでこれを行っていますか?

4

3 に答える 3

4

1 つのメソッドは、バインディングのコンバーターです。

ただし、これはプロパティが変更された場合にのみ更新されます (コレクションの内容ではありません)。そのため、オブジェクトで表示文字列プロパティを公開し、リストが変更されるたびにそのプロパティの変更通知を発行する方がよい場合があります。そもそもコレクションが変更されない場合、それらの通知は明らかに必要ありません。

于 2012-08-30T15:32:30.000 に答える
2

値コンバーターを使用します。

[ValueConversion(typeof(IEnumerable<string>), typeof(string))]
public class MyArrayToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        return String.Join (",", ( (IEnumerable<string>)value ).ToArray() );
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        throw new NotImplementedException ();
    }
}

<Window
    ...
    xmlns:my="clr-namespace:XXXXXXXXXXXXXXXXXXXXXCSharpNamespace"
    ...>
    <Window.Resources>
        <my:MyArrayToStringConverter x:Key="myconverter" />
    </Window.Resources>
    ...
    "{Binding ... Converter={StaticResource myconverter}}"
</Window>
于 2012-08-30T15:37:52.930 に答える
1

単純な値コンバーターを作成できます。

public class ListConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                          CultureInfo culture)
    {
        var enumerable = value as IEnumerable;
        if (enumerable == null)
            return string.Empty;
        return String.Join(", ", enumerable.ToArray());
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                              CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-08-30T15:36:01.057 に答える