में कोड में सेट मैं एक सूची बॉक्स के साथ एक XAML दृश्य के लिए ListBox:स्क्रॉल WPF SelectedItem एक दृश्य मॉडल
<control:ListBoxScroll ItemSource="{Binding Path=FooCollection}"
SelectedItem="{Binding SelectedFoo, Mode=TwoWay}"
ScrollSelectedItem="{Binding SelectedFoo}">
<!-- data templates, etc. -->
</control:ListBoxScroll>
चयनित आइटम मेरे विचार में एक संपत्ति के लिए बाध्य है। जब उपयोगकर्ता सूची बॉक्स में कोई आइटम चुनता है तो दृश्य मॉडल में मेरी चुनीFoo संपत्ति अपडेट हो जाती है। जब मैं अपने दृश्य मॉडल में SelectedFoo प्रॉपर्टी सेट करता हूं तो सूची आइटम में सही आइटम चुना जाता है।
समस्या यह है कि यदि कोड में सेट किया गया चयनित फ़ूज़ वर्तमान में दृश्यमान नहीं है तो मुझे सूची बॉक्स पर ScrollIntoView
को अतिरिक्त रूप से कॉल करने की आवश्यकता है। चूंकि मेरा लिस्टबॉक्स एक दृश्य के अंदर है और मेरा तर्क मेरे दृश्य मॉडल के अंदर है ... मुझे इसे करने का एक सुविधाजनक तरीका नहीं मिला।
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);
}
}
यह मूल रूप से एक नया निर्भरता संपत्ति ScrollSelectedItem
जो मैं मेरे विचार मॉडल पर SelectedFoo
संपत्ति के लिए बाध्य को उजागर करता है: तो मैं ListBoxScroll बढ़ाया। मैं फिर संपत्ति में हुक आश्रित संपत्ति के कॉलबैक बदल दिया और नए चुने हुए आइटम को देखने के लिए स्क्रॉल करें।
क्या किसी और को एक दृश्य मॉडल द्वारा समर्थित XAML दृश्य पर उपयोगकर्ता नियंत्रण पर फ़ंक्शंस कॉल करने का एक आसान तरीका पता है? यह करने के लिए चारों ओर एक रन का एक सा है:
- एक आश्रित संपत्ति
- बनाने संपत्ति के लिए एक कॉलबैक जोड़ने स्थिर कॉलबैक अंदर कॉलबैक बदल
- संभाल समारोह मंगलाचरण
यह अच्छा होगा ScrollSelectedItem { set {
विधि में तर्क को सही करने के लिए, लेकिन निर्भरता ढांचा वास्तव में इसे कॉल किए बिना काम करने के लिए घूमता है और काम करता है।
'चयनित इंडेक्स' सेट करना बहुत आसान होगा। –
यह व्यूमोडेल के बजाय एक दृश्य "चिंता" जैसा लगता है। मुझे कुछ ऐसा करना पड़ा लेकिन मैंने दृश्य में कोड छोड़ा। Http://matthamilton.net/focus-a-virtualized-listboxitem –
@MattHamilton देखें - यह कोड तकनीकी रूप से दृश्य (नियंत्रण में) है। एक दृश्य (कहीं भी) में आप कौन सा कोड लिखेंगे जो ScrollIntoView को कॉल करना पूरा करेगा? ध्यान रखें कि मैं चयनित इटैम पर सेट को ओवरराइड नहीं कर सकता क्योंकि यह वर्चुअल नहीं है। –