2015-01-19 5 views
8

मैं अक्सर अपने व्यूमोडेल में एक TreeViewItem के IsExpanded और IsSelected गुणों को बांधता हूं। उदाहरण के लिए, जब पेड़ लोड हो जाता है या किसी आइटम को चुनने पर विस्तृत किया जाता है तो आइटम को पूर्व-विस्तारित करना संभव बनाता है।मैं शैली के लिए एक डिजाइनर डेटाैकेंटेक्स्ट कैसे निर्दिष्ट कर सकता हूं, इसलिए Resharper मेरी गुण पाता है?

XAML इस तरह दिखता है:

<Window x:Class="StyleSetterDatatypeTest.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:test="clr-namespace:StyleSetterDatatypeTest" 
      Title="MainWindow" Height="350" Width="525" 
      mc:Ignorable="d" 
      d:DataContext="{d:DesignInstance test:TestViewModel, IsDesignTimeCreatable=True}"> 

    <TreeView ItemsSource="{Binding Items}"> 
     <TreeView.Resources> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="IsExpanded" Value="{Binding ItemExpanded}"/> 
       <Setter Property="IsSelected" Value="{Binding ItemSelected}"/> 
      </Style> 

      <HierarchicalDataTemplate DataType="{x:Type test:TestItemViewModel}" ItemsSource="{Binding Children}"> 
       <TextBlock Text="{Binding Name}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
</Window> 

और मेरे viewmodel ऐसा दिखाई दे सकता:

public class TestItemViewModel 
{ 
    public bool ItemExpanded { get; set; } 

    public bool ItemSelected { get; set; } 

    public string Name { get; set; } 

    public string[] Children 
    { 
     get { return new [] {"Child 1", "Child 2"}; } 
    } 
} 

यह निष्पादन और डिजाइनर में ठीक काम करता है, लेकिन Resharper ItemSelected नहीं मिल रहा और ItemExpanded गुण है बाइंडिंग में और उन्हें एक चेतावनी के रूप में रेखांकित करता है।
मैं समझ सकता हूं कि यह उन्हें क्यों नहीं ढूंढता है (मैंने शैली के लिए डेटाकोन्टेक्स्ट प्रकार के रूप में "TestViewModel" निर्दिष्ट नहीं किया है), लेकिन मैं इसे कैसे ठीक कर सकता हूं?

समस्या यहाँ है, शैली TreeView में परिभाषित किया गया है और वहाँ DataContext स्पष्ट रूप से एक TestViewModel पर सेट है: एक शैली-डिजाइन-DataContext ...

अद्यतन के रूप में ऐसी कोई चीज नहीं है। चेकर नहीं मिलता है, जो कि मैं शैली हूं वह एक वृक्ष दृश्य आइटम है और इस आइटम में टेस्ट आइटम का डेटा कॉन्टेक्स्ट है व्यूमोडेल (आइटम स्रोत स्रोत का प्रकार)।

ओह, और मैं भी TreeView.ItemContainerStyle में शैली स्थापित करने की कोशिश की बजाय अगर TreeView.Resources (यहां यह स्पष्ट किया जाना चाहिए DataContext एक TextItemViewModel हो गया है), लेकिन यह कुछ भी नहीं बदलता है ...

+0

उपयोग relativeSource बाध्यकारी –

+0

को खोजने के लिए है कि केवल नहीं है अन्य दृश्य? मैंने अपने व्यूमोडेल प्रॉपर्टी नामों को और अधिक स्पष्ट करने के लिए संपादित किया है, मैं व्यूमोडेल पर बाध्यकारी हूं। – JCH2k

उत्तर

10

के लिए एक समान समाधान @ lhildebrandt का जवाब होना करने के लिए लगता है कि आम तौर पर ठीक है, लेकिन मेरे मामले में इस समाधान त्रुटियों कि पूरी तरह से डिजाइनर में दृश्य प्रदर्शित को निष्क्रिय पैदा करता है। <d:Style.DataContext>निर्दिष्ट<Style> टैग ने मुझे मदद की।

<Style> 
    <d:Style.DataContext> 
     <x:Type Type="local:MyTreeItem" /> 
    </d:Style.DataContext> 
    <!--usual setters, triggers, etc.--> 
</Style> 

इस तरह d:DataContext भी नियंत्रण के लिए निर्दिष्ट किया जा सकता, और हम इसे इंटरफेस प्रदान कर सकते हैं, नेस्टेड वर्गों और यहां तक ​​कि जेनरिक किसी भी त्रुटि के बिना: https://stackoverflow.com/a/46637478/5598194

+0

यह आखिरकार काम करता है! कोई और डिजाइनर त्रुटियां नहीं! – JCH2k

+1

शानदार! D: डेटा कॉन्टेक्स्ट को एक संलग्न संपत्ति के रूप में असाइन करना (जैसा कि मैं आमतौर पर विंडो/उपयोगकर्ता नियंत्रण के लिए करता हूं) ने डिज़ाइनर-त्रुटि उत्पन्न की, लेकिन रीशेर्पर गुणों को ढूंढने और सत्यापित करने में सक्षम था। इसे अपने जवाब के रूप में शैली के अंदर असाइन करना, डिजाइनर-त्रुटि को हटा देता है, और फिर भी रीशेपर को इसकी बात करने देता है! मैं सुझाव देता हूं कि @ JCH2k इस उत्तर को समाधान के रूप में चिह्नित करें। –

1

आप की कोशिश की है:

<Style TargetType="TreeViewItem" d:DataContext="{d:DesignInstance  
test:TestItemViewModel}"> 

कम से कम मेरे लिए गुण हाइलाइट किया जाता है और वी.एस. 2015 में IntelliSense के साथ दिखाया गया और आर # 9।

Specify datacontext type on listbox ItemContainer in style

+0

यह मेरे लिए काम नहीं करता है। मुझे त्रुटि मिलती है 'संपत्ति' DataContext 'प्रकार' शैली 'के तत्वों के लिए अनुलग्नक नहीं है –

संबंधित मुद्दे

 संबंधित मुद्दे