2009-02-03 21 views
7

मैं WPF में एक उपयोगकर्ता नियंत्रण बनाया:एक WPF UserControl में पास पैरामीटर को कैसे पढ़ा जाए?

<UserControl x:Class="TestUserControl.Controls.GetLatest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
     <TextBlock Name="theTextBlock"/> 
</UserControl> 

कोड के पीछे एक पैरामीटर है जो यह मेरे उपयोगकर्ता नियंत्रण TextBlock के पाठ के रूप में सेट "FirstMessage" कहा जाता है:

public partial class GetLatest : UserControl 
{ 
    public string FirstMessage { get; set; } 

    public GetLatest() 
    { 
     InitializeComponent(); 
     theTextBlock.Text = this.FirstMessage; 
    } 
} 

अपने मुख्य कोड में मैं इंटेलिजेंस के साथ अपने उपयोगकर्ता नियंत्रण में फर्स्ट मैसेज पैरामीटर सेट कर सकता हूं:

<Window x:Class="TestUserControl.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    xmlns:controls="clr-namespace:TestUserControl.Controls" 
    > 
    <StackPanel> 
     <controls:GetLatest FirstMessage="This is the title"/> 
    </StackPanel> 
</Window> 

हालांकि, यह अभी भी टेक्स्ट सेट नहीं करता है। मैंने टेक्स्ट = "{बाइंडिंग पथ = फर्स्टमेसेज}" और अन्य वाक्यविन्यासों को आजमाया है लेकिन कुछ भी काम नहीं करता है।

मैं अपने उपयोगकर्ता नियंत्रण में प्रथम संदेश मूल्य का उपयोग कैसे कर सकता हूं?

उत्तर

15

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

public partial class GetLatest : UserControl 
{ 
    public static readonly DependencyProperty FirstMessageProperty = DependencyProperty.Register("FirstMessage", typeof(string), typeof(GetLatest)); 

    public string FirstMessage 
    { 
     get { return (string)GetValue(FirstMessageProperty); } 
     set { SetValue(FirstMessageProperty, value); } 
    } 

    public GetLatest() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

} 

XAML:

<UserControl x:Class="TestUserControl.Controls.GetLatest" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <TextBlock Text="{Binding FirstMessage}" /> 
</UserControl> 

जब भी FirstMessage गुण परिवर्तन, अपने पाठ खंड अपने आप अपडेट हो जाएगा।

+0

हाँ! वास्तव में मैं क्या देख रहा था, धन्यवाद! –

+0

मैंने आपके समाधान की कोशिश की और त्रुटि प्राप्त की "पेड़ की यात्रा करते समय तार्किक पेड़ की गहराई पार हो गई। यह पेड़ में एक चक्र को इंगित कर सकता है।" लेकिन जब मैं लाइन को हटा देता हूं। डेटा कॉन्टेक्स्ट = यह; त्रुटि गायब हो जाती है लेकिन बाध्यकारी काम नहीं करेगा। यहां क्या समस्या है? –

+0

@ ट्री क्यू: मैं लॉजिकल पेड़ गहराई अपवाद भी देख रहा हूं लेकिन विभिन्न कोड में भी। वेब पर इस त्रुटि के बारे में बहुत अधिक प्रतीत नहीं होता है, इसलिए यदि आप समाधान प्राप्त करते हैं तो आप उत्सुक हैं यदि आप जवाब दे सकते हैं। – jpierson

3

फर्स्ट मैसेज को कन्स्ट्रक्टर के नाम पर सेट करने के बाद सेट किया गया है। आपको अपना टेक्स्ट फर्स्ट मैसेज के सेटटर से बदलना चाहिए।

XAML से ऑब्जेक्ट प्रारंभ करते समय, पहले डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है, तो गुण ऑब्जेक्ट पर सेट होते हैं।

0

आपके द्वारा पोस्ट किए गए कोड के मामले में यह एक समय मुद्दा है; फर्स्ट मैसेज प्रॉपर्टी का कंट्रोलर निष्पादित होने पर अपना मूल्य असाइन नहीं किया गया है। आपको बाद में लोड होने जैसी घटना में उस कोड को निष्पादित करना होगा।

2

यह त्वरित उदाहरण किसी भी बाध्यकारी का उपयोग नहीं करेगा क्योंकि डिफ़ॉल्ट नियंत्रक के नाम तक मूल्य स्थापित नहीं किया गया है, लेकिन यहां आप पाठ को दिखाने के लिए कैसे प्राप्त कर सकते हैं।

<UserControl x:Class="TestUserControl.Controls.GetLatest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="GetLatest_Loaded"> 
     <TextBlock Name="theTextBlock"/> 
</UserControl> 

फिर, सिर्फ इस के लिए अपने सीएस फ़ाइल को संशोधित:

public partial class GetLatest : UserControl 
{ 
    public string FirstMessage { get; set; } 

    public GetLatest() 
    { 
     InitializeComponent(); 
     theTextBlock.Text = this.FirstMessage; 
    } 

    private void GetLatest_Loaded(object sender, RoutedEventArgs e) 
    { 
     theTextBlock.Text = this.FirstMessage; 
    } 
} 

मैं बजाय एक बाध्यकारी की स्थापना, के रूप में यह काफी स्पेगेटी की तरह कोड है पर काम कर सलाह देते हैं।

1

तुम भी उपयोग कर सकते हैं:

public partial class GetLatest : UserControl 
{ 
    private string _firstMessage; 
    public string FirstMessage 
    { 
     get { return _firstMessage; } 
     set { _firstMessage = value; theTextBlock.Text = value; } 
    } 

    public GetLatest() 
    { 
     InitializeComponent(); 
    } 
} 
संबंधित मुद्दे