我有一個列表框XAML視圖中的SelectedItem:滾動列表框WPF在代碼中設置一個視圖模型
<control:ListBoxScroll ItemSource="{Binding Path=FooCollection}"
SelectedItem="{Binding SelectedFoo, Mode=TwoWay}"
ScrollSelectedItem="{Binding SelectedFoo}">
<!-- data templates, etc. -->
</control:ListBoxScroll>
選定的項目綁定到我的視圖屬性。當用戶在列表框中選擇一個項目時,視圖模型中的SelectedFoo屬性被更新。當我在視圖模型中設置SelectedFoo屬性時,在列表框中選擇正確的項目。
問題是,如果代碼中設置的SelectedFoo當前不可見,則需要在列表框上另外調用ScrollIntoView
。由於我的ListBox在一個視圖內,而我的邏輯在我的視圖模型中......我找不到一個方便的方法來完成它。所以我延長ListBoxScroll:
class ListBoxScroll : ListBox
{
public static readonly DependencyProperty ScrollSelectedItemProperty = DependencyProperty.Register(
"ScrollSelectedItem",
typeof(object),
typeof(ListBoxScroll),
new FrameworkPropertyMetadata(
null,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(onScrollSelectedChanged)));
public object ScrollSelectedItem
{
get { return (object)GetValue(ScrollSelectedItemProperty); }
set { SetValue(ScrollSelectedItemProperty, value); }
}
private static void onScrollSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var listbox = d as ListBoxScroll;
listbox.ScrollIntoView(e.NewValue);
}
}
它基本上暴露我綁定到我的視圖模型的SelectedFoo
物業新依賴屬性ScrollSelectedItem
。然後我鉤入屬性改變了依賴屬性的回調,並將新選擇的項目滾動到視圖中。
是否有其他人知道更簡單的方法來調用視圖模型支持的XAML視圖上的用戶控件上的函數?這是一個有點跑的身邊:
- 創建一個依賴屬性
- 回調添加到屬性更改回調靜態回調內
- 處理函數調用
這將是很好將邏輯權放在ScrollSelectedItem { set {
方法中,但依賴框架似乎潛入並且設法工作而不實際調用它。
設置'SelectedIndex'會容易得多。 – 2012-01-11 22:24:53
這聽起來像是一個View「關注點」,而不是ViewModel。我不得不做類似的事情,但我把代碼留在了視圖中。請參閱http://matthamilton.net/focus-a-virtualized-listboxitem – 2012-01-11 22:31:44
@MattHamilton - 此代碼在技術上位於View中(在控件中)。你將在一個視圖(任何地方)中編寫什麼代碼來完成調用ScrollIntoView?請記住,我不能覆蓋SelectedItem上的集合,因爲它不是虛擬的。 – 2012-01-11 22:49:51