<ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"><ListView.ContextMenu><ContextMenu><MenuItem Header="刪除" Command="{Binding DeleteSelectedItemCommand}"/></ContextMenu></ListView.ContextMenu><i:Interaction.Behaviors><behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/></i:Interaction.Behaviors><ListView.View><GridView><GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"/></GridView></ListView.View></ListView>
1. ListView
控件的定義
<ListView ItemsSource="{Binding SchemeItems}" SelectionMode="Extended" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
ItemsSource="{Binding SchemeItems}"
:- 這是數據綁定的屬性,表示
ListView
的數據源綁定到視圖模型(ViewModel)中的SchemeItems
屬性。 SchemeItems
應該是一個集合類型(如ObservableCollection
),其中存儲了要顯示在ListView
中的數據項。
- 這是數據綁定的屬性,表示
SelectionMode="Extended"
:- 設置
ListView
的選中模式為“擴展模式”,允許用戶通過按下Ctrl
或Shift
鍵選擇多個項目。
- 設置
VerticalAlignment="Stretch"
和HorizontalAlignment="Stretch"
:- 這兩個屬性設置
ListView
在父容器中垂直和水平方向上拉伸以填充可用空間。
- 這兩個屬性設置
2. 上下文菜單(ContextMenu
)
<ListView.ContextMenu><ContextMenu><MenuItem Header="刪除" Command="{Binding DeleteSelectedItemCommand}"/></ContextMenu>
</ListView.ContextMenu>
ContextMenu
:- 定義了
ListView
的上下文菜單,即用戶右鍵單擊ListView
時顯示的菜單。
- 定義了
MenuItem Header="刪除" Command="{Binding DeleteSelectedItemCommand}"
:- 定義了一個菜單項,標題為“刪除”。
Command="{Binding DeleteSelectedItemCommand}"
:- 綁定了一個命令,當用戶點擊“刪除”菜單項時,會觸發視圖模型中的
DeleteSelectedItemCommand
命令。 - 這個命令通常用于刪除選中的項目。
- 綁定了一個命令,當用戶點擊“刪除”菜單項時,會觸發視圖模型中的
3. 行為(Interaction.Behaviors
)
<i:Interaction.Behaviors><behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>
</i:Interaction.Behaviors>
Interaction.Behaviors
:- 使用了
System.Windows.Interactivity
命名空間(通常通過xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
引入)來添加行為。
- 使用了
behaviors:SelectedItemsBehavior
:- 這是一個自定義行為,可能是為了處理
ListView
的多選項目。
- 這是一個自定義行為,可能是為了處理
SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"
:- 將行為的
SelectedItems
屬性與視圖模型中的SelectedSchemeItems
屬性進行雙向綁定。 - 這樣,當用戶在
ListView
中選擇項目時,SelectedSchemeItems
會自動更新,反之亦然。
- 將行為的
4. ListView
的視圖(ListView.View
)
<ListView.View><GridView><GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"/></GridView>
</ListView.View>
ListView.View
:- 定義了
ListView
的顯示方式,這里使用了GridView
,即表格視圖。
- 定義了
GridViewColumn Header="方案名" DisplayMemberBinding="{Binding Name}"
:- 定義了一個表格列,標題為“方案名”。
DisplayMemberBinding="{Binding Name}"
:- 表示該列顯示的數據項的
Name
屬性值。 - 假設
SchemeItems
集合中的每個項目都有一個Name
屬性,那么這個屬性的值將顯示在該列中。
- 表示該列顯示的數據項的
public class SelectedItemsBehavior : Behavior<ListView>
{public static readonly DependencyProperty SelectedItemsProperty =DependencyProperty.Register(nameof(SelectedItems),typeof(ObservableCollection<SchemeItem>),typeof(SelectedItemsBehavior),new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));public ObservableCollection<SchemeItem> SelectedItems{get => (ObservableCollection<SchemeItem>)GetValue(SelectedItemsProperty);set => SetValue(SelectedItemsProperty, value);}protected override void OnAttached(){base.OnAttached();AssociatedObject.SelectionChanged += OnSelectionChanged;}protected override void OnDetaching(){AssociatedObject.SelectionChanged -= OnSelectionChanged;base.OnDetaching();}private void OnSelectionChanged(object sender, SelectionChangedEventArgs e){SelectedItems = new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>());}
}
下面代碼定義了一個名為SelectedItemsBehavior
的行為類,用于擴展ListView
的功能,特別是處理多選項目并將其與視圖模型綁定:
1. 類定義
public class SelectedItemsBehavior : Behavior<ListView>
Behavior<ListView>
:- 這是一個從
System.Windows.Interactivity.Behavior<T>
繼承的類,專門用于為ListView
控件添加行為。 Behavior<T>
是WPF中用于擴展控件功能的機制,允許開發者通過附加行為來增強控件的功能,而無需修改控件本身的代碼。
- 這是一個從
2. 依賴屬性(DependencyProperty
)
public static readonly DependencyProperty SelectedItemsProperty =DependencyProperty.Register(nameof(SelectedItems),typeof(ObservableCollection<SchemeItem>),typeof(SelectedItemsBehavior),new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
DependencyProperty.Register
:- 定義了一個名為
SelectedItemsProperty
的依賴屬性,用于存儲選中的項目集合。 nameof(SelectedItems)
:屬性的名稱。typeof(ObservableCollection<SchemeItem>)
:屬性的類型,表示選中的項目是一個ObservableCollection<SchemeItem>
集合。typeof(SelectedItemsBehavior)
:依賴屬性所屬的類。FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
:- 設置了默認值為
null
。 - 設置了
BindsTwoWayByDefault
選項,表示該屬性默認支持雙向綁定。
- 設置了默認值為
- 定義了一個名為
3. SelectedItems
屬性
public ObservableCollection<SchemeItem> SelectedItems
{get => (ObservableCollection<SchemeItem>)GetValue(SelectedItemsProperty);set => SetValue(SelectedItemsProperty, value);
}
- 這是一個包裝了
SelectedItemsProperty
依賴屬性的CLR屬性。 - 通過
GetValue
和SetValue
方法,可以方便地獲取和設置SelectedItemsProperty
的值。
4. 附加行為(OnAttached
)
protected override void OnAttached()
{base.OnAttached();AssociatedObject.SelectionChanged += OnSelectionChanged;
}
OnAttached
:- 當行為被附加到
ListView
控件時,會調用此方法。 AssociatedObject
:- 表示行為所附加的控件,在這里是
ListView
。
- 表示行為所附加的控件,在這里是
AssociatedObject.SelectionChanged += OnSelectionChanged
:- 訂閱了
ListView
的SelectionChanged
事件,當ListView
的選中項發生變化時,會觸發OnSelectionChanged
方法。
- 訂閱了
- 當行為被附加到
5. 分離行為(OnDetaching
)
protected override void OnDetaching()
{AssociatedObject.SelectionChanged -= OnSelectionChanged;base.OnDetaching();
}
OnDetaching
:- 當行為從
ListView
控件分離時,會調用此方法。 AssociatedObject.SelectionChanged -= OnSelectionChanged
:- 取消訂閱
SelectionChanged
事件,以避免內存泄漏。
- 取消訂閱
- 當行為從
6. 處理選中項變化(OnSelectionChanged
)
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{SelectedItems = new ObservableCollection<SchemeItem>(AssociatedObject.SelectedItems.Cast<SchemeItem>());
}
OnSelectionChanged
:- 當
ListView
的選中項發生變化時,此方法會被觸發。 AssociatedObject.SelectedItems
:- 獲取
ListView
當前選中的項目集合。
- 獲取
Cast<SchemeItem>()
:- 將選中的項目集合轉換為
SchemeItem
類型的集合。
- 將選中的項目集合轉換為
new ObservableCollection<SchemeItem>(...)
:- 創建一個新的
ObservableCollection<SchemeItem>
實例,并將其賦值給SelectedItems
屬性。 - 這樣,
SelectedItems
屬性會實時更新,反映當前ListView
的選中項。
- 創建一個新的
- 當
總結
SelectedItemsBehavior
類的作用是:
- 擴展
ListView
的功能:- 通過行為機制,為
ListView
添加了對多選項目的支持,并將其與視圖模型中的ObservableCollection<SchemeItem>
屬性進行雙向綁定。
- 通過行為機制,為
- 自動更新選中項:
- 當用戶在
ListView
中選擇或取消選擇項目時,SelectedItems
屬性會自動更新,確保視圖模型中的數據與用戶界面保持一致。
- 當用戶在
通過在XAML中使用<behaviors:SelectedItemsBehavior SelectedItems="{Binding SelectedSchemeItems, Mode=TwoWay}"/>
,可以將ListView
的選中項與視圖模型中的SelectedSchemeItems
屬性綁定,實現數據的雙向同步。