एमवीवीएम का उपयोग करते समय हम दृश्य का निपटान कर रहे हैं (जबकि व्यूमोडेल बनी रहती है)।सूची पुनर्स्थापित करें स्थिति देखें एमवीवीएम
मेरा प्रश्न यह है कि ListView
स्थिति को पुनर्स्थापित कैसे करें जब दृश्य को डिस्प्ले किए जाने पर एक से अधिक नए दृश्य को बनाते समय बंद करें?
ScrollIntoView केवल आंशिक रूप से काम करता है। मैं केवल एक ही आइटम पर स्क्रॉल कर सकता हूं और यह ऊपर या नीचे हो सकता है, इस पर कोई नियंत्रण नहीं है कि दृश्य में आइटम कहां दिखाई देगा।
मेरे पास multi-selection (और क्षैतिज स्क्रॉल-बार है, लेकिन यह अपेक्षाकृत महत्वहीन है) और कोई भी कई आइटम चुन सकता है और शायद आगे स्क्रॉल कर सकता है (चयन को बदलने के बिना)।
आदर्श रूप में ListView
की ScrollViewer
गुण बंधन करना होगा ViewModel करने के लिए है, लेकिन मुझे लगता है कि सीधे के लिए पूछ XY समस्या के अंतर्गत आते हैं के लिए डर लग रहा है (यकीन नहीं करता है, तो this भी लागू होता है)। इसके अलावा यह मुझे wpf के लिए एक बहुत ही आम बात प्रतीत होता है, लेकिन शायद मैं Google क्वेरी को ठीक तरह से तैयार करने में विफल रहता हूं क्योंकि मुझे संबंधित ListView
+ ScrollViewer
+ MVVM
कॉम्बो नहीं मिल रहा है।
क्या यह संभव है?
मैं नहीं बल्कि बदसूरत समाधान के साथ ScrollIntoView
और डेटा टेम्पलेट्स (MVVM) के साथ समस्या है। ListView
ScrollIntoView
के साथ राज्य को पुनर्स्थापित करना गलत लगता है। एक और तरीका होना चाहिए। आज Google मुझे अपने स्वयं के अनुत्तरित प्रश्न पर ले जाता है।
मैं ListView
स्थिति को पुनर्स्थापित करने के लिए एक समाधान की तलाश में हूं। mcve के रूप में निम्नलिखित पर विचार करें:
public class ViewModel
{
public class Item
{
public string Text { get; set; }
public bool IsSelected { get; set; }
public static implicit operator Item(string text) => new Item() { Text = text };
}
public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>
{
"Item 1",
"Item 2",
"Item 3 long enough to use horizontal scroll",
"Item 4",
"Item 5",
new Item {Text = "Item 6", IsSelected = true }, // select something
"Item 7",
"Item 8",
"Item 9",
};
}
public partial class MainWindow : Window
{
ViewModel _vm = new ViewModel();
public MainWindow()
{
InitializeComponent();
}
void Button_Click(object sender, RoutedEventArgs e) => DataContext = DataContext == null ? _vm : null;
}
XAML:
<StackPanel>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:ViewModel}">
<ListView Width="100" Height="100" ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
<Button Content="Click"
Click="Button_Click" />
</StackPanel>
यह कौन-सी सामग्री DataContext
के लिए बाध्य है ContentControl
के साथ एक खिड़की (बटन द्वारा चालू किए जाने या तो null
या ViewModel
उदाहरण होने के लिए) है।
मैंने IsSelected
समर्थन जोड़ा है (कुछ आइटम चुनने का प्रयास करें, छुपाएं/दिखाएं ListView
इसे पुनर्स्थापित करेगा)।
उद्देश्य है: शो ListView
, स्क्रॉल (यह 100x100
आकार है, तो उस सामग्री को बड़ा है) खड़ी और/या क्षैतिज रूप से, क्लिक करें छिपाने के लिए बटन पर क्लिक करें बटन को दिखाने के लिए और इस समय ListView
में अपने राज्य को बहाल करना चाहिए (अर्थात् स्थिति ScrollViewer
)।
मैं डॉन इस जवाब से कुछ भी उपयोग करने के लिए नहीं देखते हैं। संपादन देखें, मैंने एमसीवीई जोड़ा है, क्या आप इसे काम कर सकते हैं (राज्य बहाल कर सकते हैं)? – Sinatr
मैं आपके नमूने के अनुसार उत्तर अद्यतन करता हूं। मुझे यह भी एहसास हुआ कि मेरे मूल उत्तर में संकलन त्रुटियों का एक गुच्छा था - मैं इसके लिए क्षमा चाहता हूं। यह नोटपैड में लिखा गया था, क्योंकि मेरे पास विजुअल स्टूडियो तक पहुंच नहीं थी। यह वीएस में लिखा और परीक्षण किया गया है :) – sondergard
[GetChildOfType] (http://stackoverflow.com/a/10279201/1997232)? – Sinatr