2011-09-13 3 views
2

Google은이 문제에 대해 조금만 알아 봤지만 실제 답변을 얻지는 못했습니다. 아마 내 질문이 약간은 어설프 겠지. 여기에 간다 :캔버스에 묶인 컬렉션에서 특정 값을 가진 항목을 찾으려면 어떻게해야합니까?

나는 많은 무리를 포함하고있는 ObservableCollection<SomeModel>를 가지고있다. 그런 다음 캔버스에 해당 뷰를 추가합니다. 이것을 창 리소스에 지정하고 캔버스 'ItemsSourceObservableCollection<SomeModel>에 바인딩합니다. 이것은 잘 작동합니다. SomeModel은 SomeView에 바인딩되고, 이것은 UserControl입니다.

이제이 뷰가 포커스를 받거나 I MouseDown을 누르면 "Selected"로 표시하고 싶습니다. 어쨌든, 내가 선택한 항목을 항상 얻을 수있는 내 캔버스를 들고있는 창에 codebehind에있는 속성을 갖고 싶습니다.

나는 ObservableCollection 대신 는 바인딩을 가지고 생각하고 있었고, 모델 변경에 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에 바인딩됩니다. 그 캔버스 자체가 런타임에 주위에 사용자의 이동 컨트롤을 할 수있는 논리를 가지고 있지 않지만보기 모델

public class View1Model 
{ 
    private ObservableCollection<SomeModel> _DataModelCollection; 

    public ObservableCollection<SomeModel> DataModelCollection 
    { 
     get { return this._DataModelCollection; } 
     set { this._DataModelCollection = value; } 
    } 
} 

<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> 

그것은 주목해야한다.

+0

하지만 선택할 수있는 UserControls를 목록이 아닌 Canvas에 표시하려고합니다. 최적으로, ObservableCollection (또는 어떤 컬렉션 소송) SelectedIndex 속성을 가질 것이라고, 해당 항목 중 하나가 True로 설정된 IsSelected 속성을 가져 오는 경우 자동으로 업데이트됩니다. 나는 ListBox를 추천하는 이유를 이해하고 이전에는 다른 시나리오에서 이것을 사용했지만 지금은 캔버스를 사용하고있다. – Andreas

+0

캔버스를 사용해야하는 이유를 구체적으로 설명해주십시오. –

+0

UserControls가 Canvas에 있으므로 사용자가 정렬 할 수 있습니다. 그것들은 정확히 기뻐했다. 그들은 드래그 가능하지만 선택 가능해야합니다. – Andreas

관련 문제