दिलचस्प पोस्ट
एक्सप्रेस और सॉकेट.ओ के साथ पासपोर्ट का उपयोग कैसे करें? मैं पीडीबी के बिना स्टैक ट्रेस में लाइन नंबर कैसे जोड़ सकता हूं? सी ++ में '1234' संकलन के साथ यह कोड क्यों है? एक इकाई परीक्षण में HttpContext.Current.Session सेट क्यों करता है "extern const int;" काम के रूप में उम्मीद नहीं है? .htaccess अपाचे काम नहीं कर रहा है चरित्र प्रदर्शन पाठ एनीमेशन द्वारा एंड्रॉइड कैरेक्टर AngularJS: AngularJS ने एक टेम्पलेट गाया है के बाद अतिरिक्त कोड को चलाने के लिए कैसे? कारें गिनती OpenCV + पायथन अंक क्या सी ++ में टाइपपेफ़ खोजशब्द के लिए एक जावा समतुल्य या पद्धति है? मैं डेटासेट या डेटासेट पर एक GridView.DataSource कैसे निर्यात कर सकता / सकती हूं? jquery रोक बच्चे ट्रिगर माता पिता घटना एंड्रॉइड पर एक्सएमएल लेखन जावा गणन और इटरेटर के बीच का अंतर स्कैपी के साथ अवांछित आरएसटी टीसीपी पैकेट

क्या XAML में कैनवास के बच्चों की संपत्ति बाँधना संभव है?

मैं थोड़ा आश्चर्यचकित हूं कि कैनवस के लिए बंधन स्थापित करना संभव नहीं है। XAML के माध्यम से बच्चे। मुझे एक कोड-पीछे के दृष्टिकोण का सहारा लेना पड़ा, जो कि ऐसा कुछ दिखता है:

private void UserControl_Loaded(object sender, RoutedEventArgs e) { DesignerViewModel dvm = this.DataContext as DesignerViewModel; dvm.Document.Items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Items_CollectionChanged); foreach (UIElement element in dvm.Document.Items) designerCanvas.Children.Add(element); } private void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { ObservableCollection<UIElement> collection = sender as ObservableCollection<UIElement>; foreach (UIElement element in collection) if (!designerCanvas.Children.Contains(element)) designerCanvas.Children.Add(element); List<UIElement> removeList = new List<UIElement>(); foreach (UIElement element in designerCanvas.Children) if (!collection.Contains(element)) removeList.Add(element); foreach (UIElement element in removeList) designerCanvas.Children.Remove(element); } 

मैं बहुत कुछ करता हूं, जैसे XAML में एक बाध्यकारी सेट:

 <Canvas x:Name="designerCanvas" Children="{Binding Document.Items}" Width="{Binding Document.Width}" Height="{Binding Document.Height}"> </Canvas> 

क्या यह कोड-पीछे के दृष्टिकोण का उपयोग किए बिना पूरा करने का एक तरीका है? मैंने इस विषय पर कुछ गोगलिंग किया है, लेकिन इस विशिष्ट समस्या के लिए बहुत ज्यादा नहीं आया है।

मुझे अपना वर्तमान दृष्टिकोण पसंद नहीं है क्योंकि यह मेरा अच्छा मॉडल-व्यू-देखें मॉडल को देखने के द्वारा इसे देखने के बारे में देखें मॉडेेल

वेब के समाधान से एकत्रित समाधान "क्या XAML में कैनवास के बच्चों की संपत्ति बाँधना संभव है?"

मुझे यह विश्वास नहीं है कि बच्चों की संपत्ति के साथ बंधन का उपयोग करना संभव है मैंने वास्तव में आज ऐसा करने की कोशिश की और उसने मुझ पर ऐसा काम किया जैसा उसने किया था।

कैनवास बहुत ही मूल कंटेनर है यह वास्तव में इस तरह के काम के लिए तैयार नहीं है आपको कई आइटम्स नियंत्रणों में से एक में देखना चाहिए आप अपने व्यूमोलोड के अवलोकन के साथ अपने आइटम स्रोतों के डेटा मॉडलों का चयन कर सकते हैं और डेटाटैम्प्लेट का उपयोग करने के लिए कैसे नियंत्रण में सभी वस्तुओं को प्रदान किया जाता है।

यदि आप आइटमों को नियंत्रित नहीं करते हैं जो आपके आइटम को एक संतोषजनक ढंग से प्रदान करता है, तो आपको एक कस्टम नियंत्रण बनाना पड़ सकता है जो आपकी आवश्यकता है।

 <ItemsControl ItemsSource="{Binding Path=Circles}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas Background="White" Width="500" Height="500" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Ellipse Fill="{Binding Path=Color, Converter={StaticResource colorBrushConverter}}" Width="25" Height="25" /> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.ItemContainerStyle> <Style> <Setter Property="Canvas.Top" Value="{Binding Path=Y}" /> <Setter Property="Canvas.Left" Value="{Binding Path=X}" /> </Style> </ItemsControl.ItemContainerStyle> </ItemsControl> 

दूसरों ने पहले से ही क्या करना चाहते हैं, इस पर एक्स्टेंसिबल जवाब दिए हैं मैं सिर्फ यह बताना चाहूंगा कि आप सीधे Children को बाध्य क्यों नहीं कर सकते

समस्या बहुत सरल है – डेटा बाध्यकारी लक्ष्य केवल-पठन-योग्य संपत्ति नहीं हो सकता, और Panel.Children । बच्चे केवल-पढ़ने योग्य है। वहाँ संग्रह के लिए कोई विशेष हैंडलिंग नहीं है इसकी तुलना में, ItemsControl.ItemsSourceItemsControl.ItemsSource एक ItemsControl.ItemsSource / लिखने वाली संपत्ति है, भले ही यह संग्रह प्रकार का है – एक दुर्लभ घटना है जो किसी एनएटी वर्ग के लिए है, लेकिन बाध्यकारी परिदृश्य का समर्थन करने के लिए आवश्यक है।

ItemsControl कंट्रोल को अन्य संग्रहों से यूआई नियंत्रण के गतिशील संग्रह बनाने के लिए डिज़ाइन किया गया है, यहां तक ​​कि गैर-यूआई डेटा संग्रह भी।

आप एक Canvas पर आकर्षित करने के लिए एक ItemsControl को टेम्प्लेट कर सकते हैं। आदर्श तरीके से बैकिंग पैनल को एक Canvas में सेट करना होगा और फिर CanvasCanvas.Left और Canvas सेट करना Canvas.Left । तात्कालिक बच्चों पर Canvas.Top संपत्ति। मैं यह काम नहीं कर सका क्योंकि ItemsControl कंटेनरों के साथ अपने बच्चों को लपेटता है और इन कंटेनरों पर Canvas गुण सेट करना मुश्किल है।

इसके बजाय, मैं सभी आइटमों के लिए एक बिन के रूप में एक Grid उपयोग करता हूं और उन्हें अपने Canvas पर प्रत्येक को आकर्षित करता हूं। इस दृष्टिकोण के साथ कुछ उपरि है

 <ItemsControl x:Name="Collection" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate DataType="{x:Type local:MyPoint}"> <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Ellipse Width="10" Height="10" Fill="Black" Canvas.Left="{Binding X}" Canvas.Top="{Binding Y}"/> </Canvas> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> 

इसके पीछे कोड है जिसका उपयोग मैं स्रोत संग्रह को सेट करने के लिए करता था:

 List<MyPoint> points = new List<MyPoint>(); points.Add(new MyPoint(2, 100)); points.Add(new MyPoint(50, 20)); points.Add(new MyPoint(200, 200)); points.Add(new MyPoint(300, 370)); Collection.ItemsSource = points; 

MyPoint एक कस्टम वर्ग है जो System संस्करण की तरह व्यवहार करता है। मैंने यह प्रदर्शित करने के लिए बनाया है कि आप अपने कस्टम क्लासेस का उपयोग कर सकते हैं।

एक अंतिम विवरण: आप चाहते हैं कि किसी भी संग्रह के लिए ItemsSource संपत्ति बाँध सकते हैं। उदाहरण के लिए:

 <ItemsControls ItemsSource="{Binding Document.Items}"><!--etc, etc...--> 

ItemsControl और यह कैसे काम करता है के बारे में अधिक जानकारी के लिए, इन दस्तावेजों की जांच करें: MSDN पुस्तकालय संदर्भ ; डेटा टेम्पलेटिंग ; मदोंकंट्रोल पर डॉ WPF की श्रृंखला

 internal static class CanvasAssistant { #region Dependency Properties public static readonly DependencyProperty BoundChildrenProperty = DependencyProperty.RegisterAttached("BoundChildren", typeof (object), typeof (CanvasAssistant), new FrameworkPropertyMetadata(null, onBoundChildrenChanged)); #endregion public static void SetBoundChildren(DependencyObject dependencyObject, string value) { dependencyObject.SetValue(BoundChildrenProperty, value); } private static void onBoundChildrenChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { if (dependencyObject == null) { return; } var canvas = dependencyObject as Canvas; if (canvas == null) return; var objects = (ObservableCollection<UIElement>) e.NewValue; if (objects == null) { canvas.Children.Clear(); return; } //TODO: Create Method for that. objects.CollectionChanged += (sender, args) => { if (args.Action == NotifyCollectionChangedAction.Add) foreach (object item in args.NewItems) { canvas.Children.Add((UIElement) item); } if (args.Action == NotifyCollectionChangedAction.Remove) foreach (object item in args.OldItems) { canvas.Children.Remove((UIElement) item); } }; foreach (UIElement item in objects) { canvas.Children.Add(item); } } } 

और का उपयोग कर:

 <Canvas x:Name="PART_SomeCanvas" Controls:CanvasAssistant.BoundChildren="{TemplateBinding SomeItems}"/>