2011-09-13 4 views
2

私はこのためにちょっとした努力をしていますが、実際の回答は得られていません。おそらく、私の質問がちょっと暗いかもしれないからです。ここに行く:キャンバスにバインドされたコレクション内の特定の値を持つアイテムを見つけるには

私はObservableCollection<SomeModel>モデルの束を含んでいると言う。次に対応するビューをキャンバスに追加します。これをウィンドウのリソースで指定し、次にキャンバスのItemsSourceObservableCollection<SomeModel>にバインドします。これは正常に動作します。 SomeModelはSomeViewにバインドされています。これはUserControlです。

このビューがフォーカスを取得したとき、またはI MouseDownを使用しているときに、「選択済み」とマークしたいと思います。どういうわけか、私はキャンバスを保持しているウィンドウにコードビハインド内のプロパティを持ちたいと思います。キャンバスはいつでも選択したアイテムを取得できます。

私が代わりにObservableCollectionするBindingListを有していると考えてきた、とモデルが変更されたときにIsSelectedプロパティ、メソッドは、リストから選択した項目を抽出します。しかし、これは、アイテムのすべての変更について私に通知されるので、パフォーマンスキラーのビットであるようです。

どうすればこの問題を解決できますか?

+0

ああ、複数の選択モデルはありません。 – Andreas

+0

どのようにビューをキャンバスに追加しますか? –

+0

Window.Resourcesでは、DataTypeを指定するDataTemplateを定義します。「SomeModel」はSomeUsercontrolとして表示する必要があります。次にCanvas ItemsSourceをすべてのモデルを保持する 'ObservableCollection 'にバインドします。 – Andreas

答えて

2

これを解決するには複数の方法があります。しかし、おそらく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; } 
    } 
} 

そのキャンバス自体は、ユーザーが実行時にそれを周りのコントロールを移動できるようにする任意のロジックを持っていませんが、それは注意すべきです。

+0

しかし、選択可能なUserControlsをリストではなくキャンバスに表示したいと考えています。最適なのは、ObservableCollection(または任意のコレクションに適しています)がSelectedIndexプロパティを持つようにしたいと思います。そのアイテムの1つがIsSelectedプロパティをtrueに設定すると自動的に更新されます。私はListBoxを推奨する理由を理解していますが、以前は別のシナリオでこれを使用していましたが、現在はキャンバスになっています... – Andreas

+0

Canvasを使用する理由を詳しく教えてください –

+0

UserControlsはCanvas上にあり、それらは正確に満足しています。彼らはdraggableですが、選択する必要があります。 – Andreas

関連する問題