여러 개의 목록 보기를 뷰 모델에 바인딩하려면 어떻게 해야 합니까?
리스트뷰와 그 옆에 있는 버튼을 실장하고 있습니다.리스트 뷰에서 여러 항목을 선택한 후 버튼을 클릭하면 선택한 항목이 리스트에 넣을 수 있어야 합니다.그러나 질문은 선택한 항목을 뷰 모델에 바인딩하려면 어떻게 해야 합니까?선택 모드를 다중 모드로 변경했습니다.그럼 내가 해야 할 일은?
SelectedItem={Binding path= selectedItems}
그리고 내 뷰모델에서 선택한 속성을 만듭니다.아이템, 그러면 내가 선택한 아이템이 설정됩니까?아니면 이를 위한 올바른 솔루션은 무엇일까요?
닥터가 이미 지적한 것처럼 Selected를 바인딩할 수 있습니다.XAML 명령 파라미터에 대한 항목
많은 발굴과 검색 끝에, 나는 마침내 이 흔한 문제에 대한 간단한 해결책을 찾았다.
이 기능을 사용하려면 다음 규칙을 모두 따라야 합니다.
Ed Ball의 제안'에 따라 XAML 명령 데이터 바인딩에서 CommandParameter 속성 Before Command 속성을 정의합니다.이것은 매우 시간이 걸리는 버그입니다.
ICommand의 CanExecute 및 Execute 메서드에 개체 유형의 매개 변수가 있는지 확인하십시오.이렇게 하면 명령 매개 변수 유형이 명령 메서드의 매개 변수 유형과 일치하지 않을 때마다 발생하는 무음 캐스트 예외를 방지할 수 있습니다.
private bool OnDeleteSelectedItemsCanExecute(object SelectedItems) { // Your goes here } private bool OnDeleteSelectedItemsExecute(object SelectedItems) { // Your goes here }
예를 들어 목록 보기/목록 상자의 선택됨사용자에게 항목 속성 ICommand 메서드 또는 목록 보기/목록 상자 자체입니다.좋아요, 그렇지 않나요?
Selected를 받는 방법을 알아내는 데 많은 시간을 할애하지 않기를 바랍니다.CanExecute 매개 변수로서의 항목.
MVVM에서 이 멀티 셀렉션을 실행하는 것은 좀 까다롭습니다.SelectedItems
자산은Dependency Property
하지만, 여러분이 사용할 수 있는 몇 가지 요령이 있습니다.블로그 투고에 관한 이 3가지 분류는 이 문제를 상세하게 설명하고 유용한 해결책을 제공하는 것을 발견했다.
도움이 되었으면 좋겠다
시스템을 사용하는 경우.창문들.인터랙티브와 Microsoft.표현.대화는 이미 이루어지고 있습니다.다른 코드/동작에 영향을 주지 않는 회피책을 다음에 나타냅니다.필요한 경우 여기에서 다운로드 할 수 있습니다.
이 회피책에서는 위의 어셈블리에서 인터랙티브이벤트 트리거 및 인터랙션 설정 속성 메커니즘을 사용합니다.
XAML에서의 추가 네임스페이스 선언
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
XAML:
<ListView Name="MyListView" ItemsSource="{Binding ModelList}" DisplayMemberPath="Name" Grid.Column="0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="SelectedItems" Value="{Binding Path=SelectedItems, ElementName=MyListView}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListView>
모델 표시:
public class ModelListViewModel
{
public ObservableCollection<Model> ModelList { get; set; }
public ObservableCollection<Model> SelectedModels { get; set; }
public ModelListViewModel() {
ModelList = new ObservableCollection<Model>();
SelectedModels = new ObservableCollection<Model>();
}
public System.Collections.IList SelectedItems {
get {
return SelectedModels;
}
set {
SelectedModels.Clear();
foreach (Model model in value) {
SelectedModels.Add(model);
}
}
}
}
위의 예에서는 ListView의 선택이 변경될 때마다 ViewModel이 선택한 항목을 선택합니다.
코드 이면에서 Button_Click(...)을 처리할 수 있습니다.그런 다음 listView의 선택한 항목을 반복하여 선택한 항목 목록을 만들 수 있습니다.
View에서 ViewModel에 액세스할 수 있으므로 ViewModel에서 메서드를 호출하여 선택한 항목의 목록을 매개 변수로 전달할 수 있습니다.
바인딩에서만 사용할 수 있을지 모르겠지만 코드 배후에 사용하는 것도 나쁘지 않습니다.
코드 예:
public void Button_Click(object sender, EventArguments arg)
{
List<ListViewItem> mySelectedItems = new List<ListViewItem>();
foreach(ListViewItem item in myListView.SelectedItems)
{
mySelectedItems.Add(item);
}
ViewModel.SomeMethod(mySelectedItems);
}
편집
다음으로 미니멀리즘의 예를 제시하겠습니다.XAML 。
<DataTemplate
x:Key="CarTemplate"
DataType="{x:Type Car}">
</DataTemplate>
<ListView x:Name="myListView"
ItemsSource="{Binding Path=Cars}"
ItemTemplate="{StaticResource CarTemplate}">
</ListView>
코드 비하인드:
public void Button_Click(object sender, EventArguments arg)
{
List<Car> mySelectedItems = new List<Car>();
foreach(Car item in myListView.SelectedItems)
{
mySelectedItems.Add(item);
}
ViewModel.SomeMethod(mySelectedItems);
}
아쉽게도 Selected는항목은 읽기 전용 바인딩할 수 없는 속성입니다.
How to Databind to a Selected라는 기사에서 많은 도움을 받았습니다.WPF의 항목 속성
「 」를 사용하고 Metro/WinRT
WinRTXAMLToolkit은 바인딩 가능하기 때문에 참조할 수 있습니다.SelectedItems
종속성 속성을 확장 중 하나로 지정합니다.
바인딩할 수는 없지만 명령 매개 변수로 명령으로 보낼 수는 있습니다.
Christian의 투고에 약간의 변형으로 List View를 사용하여 유사한 코드를 구현했습니다.Selection Changed 이벤트.ViewModel에서 메서드를 호출하는 대신 Selected라는 속성을 설정했습니다.항목:
public void ListView_SelectionChanged( object s, SelectionChangedEventArgs e ) {
List<Car> mySelectedItems = new List<Car>();
foreach( Car item in myListView.SelectedItems )
mySelectedItems.Add(item);
ViewModel.SelectedItems = mySelectedItems;
}
이쪽, View Model.선택된항목은 ViewModel에 있는 모든 명령에 사용할 수 있으며 데이터 바인딩에 사용할 수 있습니다(관찰 가능한 컬렉션으로 변환하는 경우).
난 이 문제를 해결했어, 나한테는 이 문제만으로도 충분했어.
<ListBox ItemsSource="{Binding ListOfModel}" x:Name="ModelList"
SelectedItem="{Binding SelectedModel, Mode=TwoWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ExecuteListBoxSelectionChange}" CommandParameter="{Binding ElementName=ModelList}">
</i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
그런 다음 뷰 모델에서 다음을 수행합니다.
public ICommand ExecuteListBoxSelectionChange { get; private set; }
ExecuteListBoxSelectionChange = DelegatingCommand<ListBox>.For(ListBoxSelectionChnageEvent).AlwaysEnabled();
Selected Models는 선택 항목을 채우는 목록입니다.
private void ListBoxSelectionChnageEvent(ListBox modelListBox)
{
List<ModelInfo> tempModelInfo = new List<ModelInfo>();
foreach(ModelInfo a in modelListBox.SelectedItems)
tempModelInfo.Add(a);
SelectedModels = tempModelInfo;
}
언급URL : https://stackoverflow.com/questions/5741161/how-to-bind-multiple-selection-of-listview-to-viewmodel
'programing' 카테고리의 다른 글
왜 "while(!feof(file)"은 항상 잘못된 것일까요? (0) | 2023.04.13 |
---|---|
SQL DROP TABLE 외부 키 제약 조건 (0) | 2023.04.13 |
NSAttributedString의 boundingRectWithSize가 잘못된 크기를 반환함 (0) | 2023.04.13 |
UIScroll View 콘텐츠란부동산 삽입 대상? (0) | 2023.04.13 |
Swift에서 지연을 발생시키는 방법은 무엇입니까? (0) | 2023.04.13 |