2010-05-27 14 views
5

मुझे एक WPF UserControl मिला है जिसमें निर्भरता प्रॉपर्टी (माइप्रोपर्टी) है।बाध्यकारी मान बदलें, खुद को बाध्यकारी नहीं

निर्भरता प्रॉपर्टी डेटाकॉन्टेक्स्ट में एक संपत्ति के लिए बाध्य है।

अब उपयोगकर्ता नियंत्रण में मैं बाध्य संपत्ति के मूल्य को बदलना चाहता हूं। लेकिन अगर मैं MyProperty = NewValue असाइन करता हूं तो बाध्यकारी खो जाता है और न्यूवैल्यू द्वारा प्रतिस्थापित किया जाता है।

जो मैं प्राप्त करना चाहता हूं वह डेटाकॉन्टेक्स्ट-प्रॉपर्टी को निर्भर करता है निर्भरता प्रॉपर्टी बाध्यता है।

बाध्यकारी बदलने के बजाय मैं इसे कैसे प्राप्त करूं?

स्पष्टीकरण के लिए: MyTextBox.Text = "0"; जैसे कुछ का उपयोग करके मैं बाध्यकारी जारी करूंगा। मैं टेक्स्ट कैसे सेट करूं, बाध्यकारी बरकरार रहूं ताकि संपत्ति टेक्स्ट भी बदल जाए।

उत्तर

3

मैं यह नहीं बता सकता कि आप अपना कोड देखे बिना क्या कर रहे हैं। नीचे एक साधारण उपयोगकर्ता नियंत्रण है जो उपयोगकर्ताओं को रंग चुनने की अनुमति देता है।

<UserControl x:Class="ColorPickerTest.ColorPicker" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <StackPanel Orientation="Horizontal"> 
     <ToggleButton Name="redButton" Content="Red" Click="Button_Click" /> 
     <ToggleButton Name="yellowButton" Content="Yellow" Click="Button_Click" /> 
    </StackPanel> 
</UserControl> 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace ColorPickerTest 
{ 
    public partial class ColorPicker : UserControl 
    { 
     public ColorPicker() 
     { 
      InitializeComponent(); 
     } 

     public Brush SelectedColor 
     { 
      get { return (Brush)GetValue(SelectedColorProperty); } 
      set { SetValue(SelectedColorProperty, value); } 
     } 

     public static readonly DependencyProperty SelectedColorProperty = 
      DependencyProperty.Register("SelectedColor", 
             typeof(Brush), 
             typeof(ColorPicker), 
             new UIPropertyMetadata(Brushes.Transparent, OnPropertyChanged)); 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      if (!redButton.IsChecked.GetValueOrDefault() && !yellowButton.IsChecked.GetValueOrDefault()) 
      { 
       SelectedColor = Brushes.Transparent; 
      } 
      else if (!redButton.IsChecked.GetValueOrDefault() && yellowButton.IsChecked.GetValueOrDefault()) 
      { 
       SelectedColor = Brushes.Yellow; 
      } 
      else if (redButton.IsChecked.GetValueOrDefault() && !yellowButton.IsChecked.GetValueOrDefault()) 
      { 
       SelectedColor = Brushes.Red; 
      } 
      else 
      { 
       // redButton.IsChecked.GetValueOrDefault() && yellowButton.IsChecked.GetValueOrDefault()) 

       SelectedColor = Brushes.Orange; 
      } 
     } 

     private static void OnPropertyChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 
      ColorPicker colorPicker = sender as ColorPicker; 
      colorPicker.redButton.IsChecked = colorPicker.SelectedColor == Brushes.Red || 
               colorPicker.SelectedColor == Brushes.Orange; 
      colorPicker.yellowButton.IsChecked = colorPicker.SelectedColor == Brushes.Yellow || 
               colorPicker.SelectedColor == Brushes.Orange; 
     } 
    } 
} 

<Window x:Class="ColorPickerTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ColorPickerTest="clr-namespace:ColorPickerTest" 
    Height="300" Width="300"> 
    <StackPanel> 
     <ColorPickerTest:ColorPicker SelectedColor="{Binding Path=MyColor, Mode=TwoWay}" /> 
    </StackPanel> 
</Window> 

using System.Windows; 
using System.Windows.Media; 

namespace ColorPickerTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      MyColor = Brushes.Red; 

      DataContext = this; 
     } 

     private Brush _myColor; 
     public Brush MyColor 
     { 
      get { return _myColor; } 
      set 
      { 
       _myColor = value; 
       Background = _myColor; 
      } 
     } 
    } 
} 
+1

अहह, मोड = दोवे मेरी समस्या का समाधान, धन्यवाद !!! – Sam

1

यह काम करना चाहिए, केवल समस्या यह है कि पाठ बॉक्स को बाध्यकारी स्रोत को अपडेट किया जाएगा जब टेक्स्ट बॉक्स फोकस खो देता है। यह पहले गलत व्यवहार है। आप अपने बाध्यकारी के भीतर UpdateSourceTrigger=PropertyChanged निर्दिष्ट करके इसे बदल सकते हैं। इस प्रकार:

<TextBox Name="MyTextBox" Text="{Binding YourBindingPath, UpdateSourceTrigger=PropertyChanged}"/> 
4

आप SetCurrentValue का उपयोग कर सकते हैं।

SetCurrentValue विधि संपत्ति के प्रभावी मूल्य को बदलती है, लेकिन मौजूदा ट्रिगर्स, डेटा बाइंडिंग और शैलियों का काम जारी रहेगा।

+1

यह संपत्ति के लिए सीधे असाइनमेंट जैसा ही था: वनवे-बाध्यकारी पर यह बाध्यकारी गिरा दिया गया, दोवे-बाध्यकारी पर यह बाध्य संपत्ति बदल गया। – Sam

+0

वाह। टिप्पणी के लिए धन्यवाद, सैम। मेरी समस्या का एक बड़ा सिरदर्द साफ हो गया था। मुझे एहसास नहीं हुआ कि वनवे बाध्यकारी के लक्षित पक्ष पर मूल्य निर्धारित करना बाध्यकारी को मंजूरी दे दी है। मैं एक घटना का उपयोग कर रहा था और स्रोत बाध्य पथ पर फ़ंक्शन सेट कर रहा था और केवल बाध्यकारी का उपयोग करने की कोशिश कर रहा था। यह तब तक काम नहीं कर रहा जब तक कि मैं इसे दोवे पर सेट नहीं करता। –

+0

जैसा कि कोई स्टाइल-ट्रिगर पर दोवे बाध्यकारी निर्दिष्ट नहीं कर सकता है, यह सिर्फ प्रतिभा है। धन्यवाद – LuckyLikey

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