Caliburn.Micro を使用した wpf アプリケーションがあります。ListBox をオブジェクトのコレクションにバインドする必要がありますが、オブジェクトのフィールドの 1 つを表示し、どうにかして Guid (別のフィールド) を各アイテムにアタッチしたいと考えています。どうすればそれができるか教えてください。Caliburn.Micro に固有のものがあるかどうかはわかりません。それとも、WPF を使用する必要があるだけです。
ありがとう。
Caliburn.Micro を使用した wpf アプリケーションがあります。ListBox をオブジェクトのコレクションにバインドする必要がありますが、オブジェクトのフィールドの 1 つを表示し、どうにかして Guid (別のフィールド) を各アイテムにアタッチしたいと考えています。どうすればそれができるか教えてください。Caliburn.Micro に固有のものがあるかどうかはわかりません。それとも、WPF を使用する必要があるだけです。
ありがとう。
(私の悪い英語でごめんなさい)
Guid フィールドがオブジェクトの一部である場合、別の場所に格納する必要はありません。リストボックスにはフィールドが表示されますが、元のオブジェクトにまだバインドされているため、 で取得できます((MyObjectType)MyListBox.SelectedItem).Guid
。Caliburn を使用すると、VM のプロパティを SelectedItem にバインドするだけでよいため、さらに簡単になります。
ただし、Guidがオブジェクトの一部でない場合は、Paul Sasik が言ったように、Tag プロパティを使用できます。私は Tag プロパティを使用したくないので、これは別の簡単な (そしてより柔軟な) 解決方法です。オブジェクトを別のオブジェクトにカプセル化する必要があります。
public class GuidObject<T>
{
public T Instance {get;set;}
public Guid Guid {get;set;}
}
次のように使用できます。
//this is your original guidless items list
var myObjectsList = new[] { new MyObject { Name = "Dostoyevsky" },
new MyObject { Name = "Ozzy" } };
var myObjectsWithGuidList = new ObservableCollection<GuidObject<MyObject>>();
//encapsulate each MyObject on a GuidObject and include a Guid
//if your myObjectsList is already a List, you do not need to call ToList()
myObjectsList.ToList().ForEach(o => myObjectsWithGuidList.Add(new GuidObject<MyObject>() { Instance = o, Guid = Guid.NewGuid() }));
//now myObjectsWithGuidList contains a list of your itens and a Guid field, you can bind it to your ListBox
ここでは、これが実行されているのを見ることができます。
各 ListBox オブジェクトのTag プロパティを使用して、任意の情報を格納できます。
リンクから:
このプロパティは、Microsoft Visual Basic for Applications (VBA) や Windows フォームなど、他の Microsoft プログラミング モデルの Tag プロパティに似ています。タグは、要素をサブクラス化する必要なく、FrameworkElement に関するいくつかの基本的なカスタム情報を格納できる既存のプロパティの場所を提供することを目的としています。
このプロパティはオブジェクトを受け取るため、Extensible Application Markup Language (XAML) の Tag プロパティを既知の組み込み型コンバーター (ストリング。この方法で使用されるオブジェクトは通常、標準の Windows Presentation Foundation (WPF) 名前空間内にないため、XAML 要素として導入するには、外部名前空間への名前空間マッピングが必要になる場合があります。