2012-11-21 12 views
8

निम्न नमूना R # (resharper) का उपयोग पंक्ति शैली के डेटाकॉन्टेक्स्ट को खोजने में सक्षम नहीं है और गलत बाध्यकारी (रनटाइम पर ठीक काम करता है) के बारे में चेतावनी देता है। लगता है जैसे शैली ItemsSource के DataContext नहीं मिल रहा है:DataGrid.RowStyle पर डेटा कॉन्टेक्स्ट सेट करना

enter image description here

MainWindow.xaml:

<Window x:Class="TestDatacontext.MainWindow" 

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:testDatacontext="clr-namespace:TestDatacontext" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

    mc:Ignorable="d" 

    d:DataContext="{d:DesignInstance testDatacontext:MainWindowVM}" > 

<DataGrid ItemsSource="{Binding Items}" > 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow" > 
      <Setter Property="Header" Value="{Binding Name}" /> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 
</Window> 

MainWindowVM:

using System.Collections.ObjectModel; 

namespace TestDatacontext 
{ 
    class MainWindowVM 
    { 
     public ObservableCollection<ItemVM> Items { get; private set; } 
    } 
} 

ItemVM:

namespace TestDatacontext 
{ 
    class ItemVM 
    { 
     public string Name { get; set; } 
    } 
} 

उत्तर

10

आप सही हैं, रीशेर्पर को इस बारे में कोई जानकारी नहीं है कि इस विशेष नियंत्रण में RowStyle का उपयोग कैसे किया जाएगा (क्या यह ItemsSource के प्रत्येक आइटम पर शैली है? या किसी प्रकार की हेडर शैली और बाइंडिंग के पास ItemsSource ऑब्जेक्ट तक पहुंच होगी?), इसलिए यह DataContextStyle घोषणा पर टाइप करने वाले पेड़ को रोकता है।

यह समस्या Style घोषणा पर अतिरिक्त टिप्पणी के साथ हल किया जा सकता:

<Style TargetType="DataGridRow" d:DataContext="{d:DesignInstance vms:ItemVM}"> 
    <Setter Property="Header" Value="{Binding Name}" /> 
</Style> 

परियोजना, ठीक संकलन होगा वी.एस. डिजाइनर और आर # काम करेंगे, लेकिन वी.एस. XAML समर्थन त्रुटियों विंडो में 1 त्रुटि उत्पन्न करेगा - "संपत्ति 'डेटाकॉन्टेक्स्ट' प्रकार 'स्टाइल' के तत्वों के लिए अनुलग्नक नहीं है। यह थोड़ा परेशान है, लेकिन काम करता है। अन्य तरह से इस तरह संपत्ति प्रकार quilify के लिए है:

<Style TargetType="DataGridRow"> 
    <Setter Property="Header" Value="{Binding (vms:ItemVM.Name)}" /> 
</Style> 

लेकिन यह XAML समर्थन त्रुटि वी.एस. भी पैदा करता है :) और क्रम में थोड़ा अलग व्यवहार किया है - यह बाध्यकारी ItemVM प्रकार के Name संपत्ति के साथ ही काम करेंगे और काम नहीं करेगा अगर किसी भी तरह वीएम ऑब्जेक्ट को Name संपत्ति के साथ रनटाइम पर विभिन्न प्रकार के किसी अन्य ऑब्जेक्ट के साथ प्रतिस्थापित किया जाएगा (इसलिए बाध्यकारी "दृढ़ता से टाइप किया गया" बन गया)।

हम अभी भी रीशेपर 8.0 में इस तरह की समस्याओं को हल करने के लिए एक बेहतर तरीका ढूंढ रहे हैं और वीएस डिजाइनर को खुश कर सकते हैं, भ्रमित करने के लिए खेद है!

+0

स्पष्टीकरण के लिए धन्यवाद लेकिन ... मैं नहीं देख सकता कि आइटम्ससोर्स == 1 पंक्ति का संबंध 1 आइटम मान्य नहीं है और यदि यह है कि आप पंक्ति पंक्ति का डेटा कॉन्टेक्स्ट प्रत्येक पंक्ति में से किसी एक को सेट कर सकते हैं? –

+1

रीशेपर को नहीं पता कि 'पंक्ति' का अर्थपूर्ण क्या है और _how_ शैली का उपयोग नियंत्रण द्वारा किया जाएगा (या इसका कभी भी उपयोग किया जाएगा?)। बस यहां की तरह, आर # को पता नहीं है कि 'कॉलमहेडर स्टाइल' क्या है और यह नियंत्रण युक्त 'आइटम्ससोर्स' से कैसे संबंधित है: https://gist.github.com/4125475 – ControlFlow

+0

मुझे लगता है ... धन्यवाद! –

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