2013-02-01 69 views
10

x: XAML में तत्वों को पुन: व्यवस्थित करने के बाद संदर्भ को हल नहीं किया जा सकता है।एक्स कब है: WPF में संदर्भ हल हो गया है और XAML तत्व ऑर्डर क्यों प्रभावित करता है?

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

दोनों XamlParseException फेंक देते हैं।

  • मेनूइटम सिस्टम System.Xaml.XamlObjectWriterException और संदेश अनसुलझे संदर्भ के बारे में वार्ता देता है।
  • मल्टीबाइंडिंग System.Collections.Generic.KeyNotFoundException को आंतरिक अपवाद के रूप में देता है।

तो यह एक्स कब है: संदर्भ वास्तव में हल हो गया है और जब संदर्भित तत्व तत्व के बाद आता है तो केवल कुछ बाइंडिंग तोड़ती हैं?

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:xxx="clr-namespace:WpfApplication1" 
     Title="MainWindow" SizeToContent="WidthAndHeight"> 
    <Window.Resources> 
     <xxx:BoolToVisibleConverter x:Key="boolToVisibleConv"></xxx:BoolToVisibleConverter> 
     <xxx:NullToFalseConverter x:Key="nullToFalseConv"></xxx:NullToFalseConverter> 
     <xxx:NullsOrToFalseConverter x:Key="nullsOrToFalseConv"></xxx:NullsOrToFalseConverter> 
     <ContextMenu x:Key="MyMenu"> 
      <MenuItem 
       Header="Menuitem enabled when row selected" 
       IsEnabled="{Binding 
        Path=SelectedItem, 
        Source={x:Reference dataGridElement}, 
        Converter={StaticResource nullToFalseConv}}" /> 
     </ContextMenu> 
    </Window.Resources> 
    <StackPanel> 
     <DataGrid 
      Name="dataGridElement" 
      IsReadOnly="True" /> 
     <Button 
      Content="Button" 
      ContextMenu="{StaticResource MyMenu}" 
      Visibility="{Binding 
       Path=IsReadOnly, 
       Source={x:Reference dataGridElement}, 
       Converter={StaticResource boolToVisibleConv}}"> 
      <Button.IsEnabled> 
       <!--<Binding 
        Path="SelectedItem" 
        Source="{x:Reference dataGridElement}" 
        Converter="{StaticResource nullToFalseConv}"/>--> 
       <MultiBinding 
        Converter="{StaticResource nullsOrToFalseConv}"> 
        <Binding 
         Path="SelectedItem" 
         Source="{x:Reference dataGridElement}"/> 
        <Binding 
         Path="SelectedItem" 
         Source="{x:Reference dataGridElement}"/> 
       </MultiBinding> 
      </Button.IsEnabled> 
     </Button> 
    </StackPanel> 
</Window> 

यहाँ मेरी कोड के पीछे है (usings के बिना)::

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
    public class BoolToVisibleConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value == null || (bool)value == false) 
       return System.Windows.Visibility.Hidden; 
      else 
       return System.Windows.Visibility.Visible; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
    public class NullsOrToFalseConverter : IMultiValueConverter 
    { 
     public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      foreach (object val in value) 
      { 
       if (val == null) 
        return false; 
      } 
      return true; 
     } 

     public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
    public class NullToFalseConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return (value != null); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

उत्तर

-2

x:Reference WPF से बचना अनिवार्य है

यहाँ मेरी XAML है। चूंकि यह मार्कअप एक्सटेंशन XAML भाषा (200 9) में हालिया जोड़ा है। और यह पूरी तरह से WPF में समर्थित नहीं है। x:Reference के बजाय अपने Binding में ElementName का उपयोग करें।

<Binding Path="SelectedItem" 
     ElementName="dataGridElement"/> 

MSDN पर।

+1

समस्या यह है कि कभी-कभी एलिमेंटनाम को तत्व नहीं मिलता है। और यही कारण है कि मैंने x का उपयोग किया: संदर्भ पहली जगह में। जैसा कि मैं एक्स समझता हूं: संदर्भ ElementName के लिए एक वर्कअराउंड है जब यह काम नहीं करता है। उस मामले के बारे में क्या है जहां उनमें से कोई भी काम नहीं करता? उदाहरण के लिए इस मामले में ElementName का उपयोग बटन में मल्टीबाइंडिंग के लिए काम करता है। यह सक्षम है लेकिन संदर्भ मेनू आइटम को सक्षम करने के लिए काम नहीं करता है। – user2032138

+0

@ user2032138 यह एमएसडीएन लेख में समझाया गया है, "लेकिन केवल एक्सएएमएल के लिए जो WPF मार्कअप-संकलित नहीं है।" –

+1

तो इस स्थिति में जब एक्सएएमएल एक्स के अनुप्रयोग उपयोग के मुख्य यूआई का वर्णन करता है: संदर्भ समर्थित नहीं है? – user2032138

0

एमएसडीएन (http://msdn.microsoft.com/en-us/library/ee795380.aspx) से उद्धृत।

x: संदर्भ XAML 200 9 में परिभाषित एक रचना है। डब्ल्यूपीएफ में, आप एक्सएएमएल 200 फीचर्स का उपयोग कर सकते हैं, लेकिन केवल एक्सएएमएल के लिए जो WPF मार्कअप-संकलित नहीं है। एक्सएएमएल के मार्कअप-संकलित एक्सएएमएल और बीएएमएल फॉर्म वर्तमान में एक्सएएमएल 200 भाषा के कीवर्ड और विशेषताओं का समर्थन नहीं करते हैं।

1

मुझे लगता है कि ऐसा इसलिए है क्योंकि संदर्भित उदाहरण मौजूद होने से पहले आपके संसाधन (विंडो। स्रोत) पहले बनाए जाएंगे। मैं DataContext (ViewModel) के माध्यम से इसे हल करने का प्रयास करूंगा।

<Window.DataContext> 
     <yourNameSpace:YourViewModel x:Name="VieModName" /> 
    </Window.DataContext> 
<MenuItem Header="HeadrTxt" Command="{Binding CommandInViewModelCmd}" DataContext="{x:Reference Name=VieModName}" />