これを解決するには複数の方法があります。しかし、おそらくListBoxを使ってそれをバインドするのが最も簡単です。 ListBoxにはバインド可能なItemsSourceと、現在選択されている項目を持つSelectedItemプロパティがあります。また、.csファイルの背後にあるコードで何かしたい場合は、選択が変更されたときにSelectionChangedイベントを呼び出します。
ビューモデルでObservableCollectionを維持してMVVMを維持することをお勧めします。
ListBoxのスタイルまたは配置が、必要に応じてテンプレートを上書きする場合に適していない場合。
上記の方法ではうまくいかない場合でも、それを簡単に保つことができます。
UPDATE
これは、ビューを構築する方法をです。 ItemsPanel属性は、アイテムを配置するCanvasを指定するUserControl.Resourcesセクションの定義済みItemsPanelTemplateにバインドされていることに注意してください。
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:local="clr-namespace:SilverlightApplication1"
x:Class="SilverlightApplication1.View1"
d:DesignWidth="640" d:DesignHeight="480">
<UserControl.Resources>
<local:View1Model x:Key="View1ModelDataSource" />
<ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
<Canvas />
</ItemsPanelTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource View1ModelDataSource}}">
<ListBox Margin="80,85,183,54" ItemsPanel="{StaticResource ItemsPanelTemplate1}" ItemsSource="{Binding DataModelCollection}"/>
</Grid>
ビューモデルについて
public class View1Model
{
private ObservableCollection<SomeModel> _DataModelCollection;
public ObservableCollection<SomeModel> DataModelCollection
{
get { return this._DataModelCollection; }
set { this._DataModelCollection = value; }
}
}
そのキャンバス自体は、ユーザーが実行時にそれを周りのコントロールを移動できるようにする任意のロジックを持っていませんが、それは注意すべきです。
ああ、複数の選択モデルはありません。 – Andreas
どのようにビューをキャンバスに追加しますか? –
Window.Resourcesでは、DataTypeを指定するDataTemplateを定義します。「SomeModel」はSomeUsercontrolとして表示する必要があります。次にCanvas ItemsSourceをすべてのモデルを保持する 'ObservableCollection'にバインドします。 –
Andreas