2015-09-04 13 views
9

मान्यता प्राप्त नहीं हैं एक्स का उपयोग करते समय: एक UWP XAML आवेदन में बाइंड निम्नलिखित पर विचार:UWP XAML x: बाइंड विरासत में मिला इंटरफेस

interface IBaseInterface 
{ 
    string A { get; set; } 
} 
interface ISubInterface : IBaseInterface 
{ 
    string B { get; set; } 
} 
class ImplementationClass : ISubInterface 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
} 

पृष्ठ वर्ग में हम निम्नलिखित है:

public partial class MainPage : Page 
{ 
    public ISubClass TheObject = new ImplementationClass { A = "1", B = "2" }; 
    //All the rest goes here 
} 

<TextBlock Text={x:Bind Path=TheObject.A}></TextBlock> 

निम्नलिखित में से कौन संकलक त्रुटि होती है: mainpage XAML में हम निम्नलिखित स्निपेट XamlCompiler त्रुटि WMC1110: अमान्य बाध्यकारी पथ 'ए': संपत्ति 'ए' के ​​प्रकार पर नहीं पाया जा सकता 'ISubInterface'

निम्नलिखित है काम तथापि:

<TextBlock Text={x:Bind Path=TheObject.B}></TextBlock> 

किसी को भी पता है अगर यह एक है UWP XAML प्लेटफ़ॉर्म की ज्ञात सीमा जो विरासत इंटरफ़ेस-गुणों को संकलक द्वारा मान्यता प्राप्त नहीं है? या इसे एक बग माना जाना चाहिए? क्या कोई ज्ञात कामकाज है?

सहायता की बहुत सराहना की जाती है। अग्रिम धन्यवाद!

+2

आप 'IBaseInterface' बल्कि' से ISubInterface' के रूप में 'TheObject' को परिभाषित करें और देखें कि संकलक तो स्वीकार करता है' TheObject.A' करने की कोशिश कर सकते हैं? – dognose

उत्तर

7

हां, कुछ परीक्षण और शोध करने के बाद, ऐसा लगता है कि एक्स: बाइंड का उपयोग करते समय विरासत वाले इंटरफ़ेस-गुण संकलक द्वारा मान्यता प्राप्त नहीं हैं।

एक समाधान हम एक्स के बजाय पारंपरिक बाध्यकारी उपयोग कर सकते हैं के रूप में: बाइंड निम्नलिखित के रूप में:

.xaml में:

<Grid Name="MyRootGrid"> 
     <TextBlock Text="{Binding A}"></TextBlock> 
</Grid> 

xaml.cs में:

MyGrid.DataContext = TheObject; 
+0

जैसा मैंने किया था उसी निष्कर्ष पर कोशिश करने और आने के लिए धन्यवाद। मैंने कनेक्ट के माध्यम से एक बग सबमिट किया: https://connect.microsoft.com/VisualStudio/feedback/details/1770944 –

0

यदि आप एक कक्षा फू विरासत IFoo लिखते हैं।

public class Foo : INotifyPropertyChanged, IF1 
{ 
    public Foo(string name) 
    { 
     _name = name; 
    } 

    private string _name; 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    string IF1.Name 
    { 
     get { return _name; } 
     set { _name = value; OnPropertyChanged(); } 
    } 

} 

public interface IF1 
{ 
    string Name { set; get; } 
} 

और जब आप पेज में एक सूची लिखने

public ObservableCollection<Foo> Foo { set; get; } = new ObservableCollection<Foo>() 
    { 
     new Foo("jlong"){} 
    }; 

आप इसे कैसे XAML में बाध्य कर सकते हैं?

मुझे इसे बांधने का एक तरीका मिल गया है। आपको x:bind का उपयोग करना चाहिए और xaml में बांधने के लिए Path=(name:interface.xx) का उपयोग करना चाहिए।

<ListView ItemsSource="{x:Bind Foo}"> 
     <ListView.ItemTemplate> 
      <DataTemplate x:DataType="local:Foo"> 
       <TextBlock Text="x:Bind Path=(local:IFoo.Name)"></TextBlock> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
संबंधित मुद्दे