2012-06-11 18 views
6

के लिए प्रॉक्सी बनाएं मैं एक साधारण निर्भरता संपत्ति प्रॉक्सी बनाने की कोशिश कर रहा हूं। मैंने कस्टम नियंत्रण किया है, यह एक फ़ाइल पिकर है, जो एक टेक्स्टबॉक्स से बना है (नाम: "TextBox_FilePath") और एक बटन खुली फ़ाइल संवाद दिखा रहा है।एक निर्भरता संपत्ति

जैसा कि मैं एक पुन: प्रयोज्य नियंत्रण कर रहा हूं, मुझे यह "SelectedFilePath" संपत्ति चाहिए। Text संपत्ति "SelectedFilePath" संपत्ति होने के लिए मेरे नियंत्रण के लिए बिल्कुल सही प्रतीत होती है, इसलिए मैं इन निर्भरता संपत्ति को प्रॉक्सी करना चाहता हूं।

पहले दृष्टिकोण मैंने बनाया था:

public static readonly DependencyProperty SelectedFilePathProperty = TextBox.TextProperty; 

public string SelectedFilePath 
{ 
    get { return (string) this.TextBox_FilePath.GetValue(SelectedFilePathProperty); } 
    set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); } 
} 

जो काम किया, लेकिन एक अपवाद जब कि संपत्ति के लिए बाध्य करने की कोशिश कर throwed। फिर मैं इसके साथ आया:

public static readonly DependencyProperty SelectedFilePathProperty = 
    DependencyProperty.Register("SelectedFilePath", typeof (string), typeof (FilePicker), new PropertyMetadata(default(string))); 

public string SelectedFilePath 
{ 
    get { return (string) this.TextBox_FilePath.GetValue(SelectedFilePathProperty); } 
    set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); } 
} 

जो काम करता है, लेकिन मुझे नहीं पता कि क्यों ?! मैंने कहां निर्दिष्ट किया था कि मैं text टेक्स्टबॉक्स की संपत्ति चाहता था?

उस निर्भरता संपत्ति को आसानी से प्रॉक्सी करने के लिए मुझे क्या याद आ रही है?

संपादित करें: AddOwner साथ समाधान भी काम नहीं करता है, फेंक देता है एक Excetion कह "बाइंडिंग केवल एक निर्भरता संपत्ति पर लागू किया जा सकता"। कोड:

public static readonly DependencyProperty SelectedFilePathProperty = 
    TextBox.TextProperty.AddOwner(typeof(FilePicker)); 

public string SelectedFilePath 
{ 
    get { return (string)this.TextBox_FilePath.GetValue(SelectedFilePathProperty); } 
    set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); } 
} 

मुझे क्या समझ में नहीं आता?

EDIT2: हर कोई मुद्दों जवाब को समझने और कुछ होने के लिए, मैं कर दिया है a little graphic

उत्तर

3

पहले दृष्टिकोण काम नहीं करता है, क्योंकि संपत्ति पंजीकृत केवल TextBox के लिए, किसी अन्य रूप में एक संदर्भ जोड़ने है कक्षा कुछ नहीं करता है।

दूसरा वाला एक पूरी नई स्ट्रिंग प्रॉपर्टी बनाता है।

यदि आप वास्तव में पर AddOwner पर पुन: उपयोग करना चाहते हैं।

उदा।

public static readonly DependencyProperty SelectedFilePathProperty = 
    TextBox.TextProperty.AddOwner(typeof(FilePicker)); 

(ध्यान दें कि यह संपत्ति "Text" रूप में पंजीकृत है, इसलिए यदि आप करना चाहते हैं तो आप शायद सिर्फ नाम के साथ एक नया संपत्ति आप के रूप में आप पहले से ही किया था। मैं भी bind two-way by default को set metadata flags करने की सिफारिश करेंगे चाहते हैं बनाना चाहिए TextBox.Text के समान बाध्यकारी व्यवहार।)

+0

देखने के लिए कृपया मेरे संपादन :) – GameScripting

+0

* के रूप में मैंने कहा *, यह नाम "पाठ" के साथ पंजीकृत है, तो आप इसलिए केवल एक संपत्ति बुलाया करने के लिए बाध्य कर सकते हैं 'टेक्स्ट', आपके द्वारा बनाई गई' चुनी गई FilePath' प्रॉपर्टी केवल आपके अनिवार्य कोड में सुविधा के लिए एक रैपर है, बाइंडिंग इसका कभी भी उपयोग नहीं करती है। यदि आप एक अलग नाम चाहते हैं तो अपनी खुद की संपत्ति पंजीकृत करें। –

+0

क्या आप बहुत दयालु हो सकते हैं और एक उदाहरण प्रदान कर सकते हैं या ऐसा करने के बारे में कोई संदर्भ दे सकते हैं? – GameScripting

1

यह समाधान थोड़ा मुश्किल है लेकिन काम करता है।

इस उपयोगकर्ता नियंत्रण को देखते हुए:

<Grid> 
    <StackPanel> 
     <WpfApplication1:FilePicker SelectedFilePath ="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <TextBlock Text="{Binding MyProperty}" /> 
    </StackPanel> 
</Grid> 

और इसकी viewmodel: FilePicker नियंत्रण के लिए

public class MainWindowViewModel : INotifyPropertyChanged 
{ 
    #region Implementation of INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string e) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(e)); 
    } 

    #endregion 

    private string _myProperty; 
    public string MyProperty 
    { 
     get { return _myProperty; } 
     set 
     { 
      _myProperty = value; 
      OnPropertyChanged("MyProperty"); 
     } 
    } 
} 

XAML:

: FilePicker नियंत्रण के लिए

<Grid> 
    <TextBox x:Name="TextBox_FilePath" DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type WpfApplication1:FilePicker}}}" Text="{Binding SelectedFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
</Grid> 

codebehind

एक आकर्षण की तरह काम करता है।

+0

पूर्ण जिस्ट यहां पाया जा सकता है: https://gist.github.com/2917066 –

+0

बहुत धन्यवाद, आपके उदाहरण के बिना मैं इसे काम नहीं करूँगा! – GameScripting

0

जैसा कि मुझे H.B.s answer समझने में समस्याएं थीं, मैंने थोड़ा ग्राफिक बनाया जिसने मुझे समझने में मदद की कि हुड के नीचे क्या चल रहा है। यह रहा;

enter image description here

शायद यह मदद करता है किसी और :)

+0

अब मैं यह प्राप्त करता हूं कि आपको यह नहीं मिला: पी –