2010-06-24 22 views
5

का उपयोग कर सिल्वरलाइट 4 में FontWeight को बाध्यकारी मैं विभिन्न गुणों के दो संस्करणों की तुलना करना चाहता हूं और उनमें से एक बोल्ड यदि यह दूसरे के बराबर नहीं है। चूंकि एसएल 4 मल्टीबाइंडिंग का समर्थन नहीं करता है, इसलिए मैं फ़ॉन्टवेइट को बाध्यकारी कर रहा हूं। " ताकि संपूर्ण डेटा संदर्भ कनवर्टर को पास कर दिया गया हो। मैं कनवर्टर के भीतर तुलना करने के लिए कौन से फ़ील्ड को निर्दिष्ट करने के लिए कनवर्टर पैरामीटर का उपयोग करता हूं। अब तक, बहुत अच्छा ... मूल्य जो मेल नहीं खाते हैं बोल्ड हैं।एक मूल्य कनवर्टर

समस्या यह है कि बोल्ड संपत्ति एक टेक्स्ट बॉक्स से जुड़ी होती है जिसे संपादित किया जा सकता है। जब मान संपादित किया जाता है, तो मैं कनवर्टर को "पुनः सक्रिय" होना चाहता हूं ताकि फ़ॉन्ट वजन नया मान के अनुसार सेट किया गया हो। ऐसा नहीं होता है। इसे किस तरह पूर्ण कर सकते है?

नोट: मैंने प्रासंगिक वर्ग और गुणों के लिए पहले से ही INotifyProperty को लागू किया है। मूल्य बदलने के बाद अगले क्षेत्र में टैब्स करने से प्रॉपर्टी चेंजेड इवेंट आग लगती है, लेकिन फ़ॉन्ट वजन अपडेट नहीं होता है जब तक कि मैं वास्तव में एक अलग रिकॉर्ड में नहीं जाता और फिर बदल गया रिकॉर्ड पर वापस आ जाता है।

(मैं भी का उपयोग कर मोड = TwoWay कि अगर चाल करना होगा देखने के लिए, बाध्यकारी है जब आप के लिए बाध्य कर रहे हैं नहीं किया जा सकता की कोशिश की। हालांकि TwoWay "।")

उत्तर

2

आप एक मूल्य कनवर्टर का उपयोग करने की आवश्यकता है? मैंने एमवीवीएम पैटर्न का उपयोग करके इस त्वरित कोशिश की और यह बहुत अच्छी तरह से काम किया। आप MVVM इस्तेमाल कर सकते हैं, तो आप इसे इस तरह संभवतः कर सकता है:

MainPage.xaml

<UserControl x:Class="BindBoldText.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:BindBoldText" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 

<UserControl.DataContext> 
    <local:MainPage_ViewModel/> 
</UserControl.DataContext> 

<StackPanel> 
    <TextBlock Text="{Binding Value1, Mode=TwoWay}"/> 
    <TextBlock Text="{Binding Value2, Mode=TwoWay}" FontWeight="{Binding Value2FontWeight}"/> 
    <TextBox Text="{Binding Value2, Mode=TwoWay}" TextChanged="TextBox_TextChanged"/> 
</StackPanel> 

MainPage.xaml.cs

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     this.viewModel = this.DataContext as MainPage_ViewModel; 
    } 

    private MainPage_ViewModel viewModel; 

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    {    
     viewModel.Value2 = (sender as TextBox).Text; 
    } 
} 

MainPage_ViewModel.cs

public class MainPage_ViewModel : INotifyPropertyChanged 
{ 
    public string Value1 
    { 
     get { return value1; } 
     set 
     { 
      if (value1 != value) 
      { 
       value1 = value; 
       OnPropertyChanged("Value1"); 
      } 
     } 
    } 
    private string value1 = "Test"; 

    public string Value2 
    { 
     get { return value2; } 
     set 
     { 
      if (value2 != value) 
      { 
       value2 = value; 
       OnPropertyChanged("Value2"); 
       OnPropertyChanged("Value2FontWeight"); 
      } 
     } 
    } 
    private string value2 = "Test"; 

    public FontWeight Value2FontWeight 
    { 
     get 
     { 
      if (value2.Equals(value1)) 
      { 
       return FontWeights.Normal; 
      } 
      else 
      { 
       return FontWeights.Bold; 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

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

    #endregion 
} 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद। (देरी के लिए खेद है। मैं बस एक छोटी, लेकिन बहुत जरूरी, छुट्टी से वापस आ गया। :-)) मैं नीचे इस ग्रीनआईकिकल के सुझाव के साथ इस दृष्टिकोण को आजमाउंगा। मूल्य कनवर्टर में ऐसा करने की आवश्यकता नहीं है। हालांकि, मैं आरआईए सेवाओं के संयोजन के साथ ऐसा करने की कोशिश कर रहा हूं। क्या कोई चेतावनी है कि मुझे एमवीवीएम दृष्टिकोण का उपयोग करते समय अवगत होना चाहिए जैसा कि आप आरआईए सेवाओं के साथ ऊपर वर्णित करते हैं? – MylesRip

+0

मैंने कोशिश की और यह मेरे लिए काम किया। FWIW ... आरआईए सेवाओं में मैं अपने डीटीओ में "Value2FontWeight" संपत्ति (जैसा ऊपर परिभाषित किया गया है) जोड़ने के लिए .shared कोड का उपयोग कर सकता हूं (इस मामले में मुझे लगता है कि यह अब सख्त अर्थ में डीटीओ नहीं है, लेकिन यह ठीक है)। – MylesRip

+1

FWIW ... ऐसा लगता है कि आरआईए सेवाओं के साथ इस दृष्टिकोण का उपयोग करने में थोड़ी सी समस्या है (यदि आप एक दृश्य मॉडल का उपयोग नहीं कर रहे हैं)।क्लाइंट के लिए जेनरेट किया गया कोड गुणों के लिए अपने स्वयं के सेटटर विधियों की आपूर्ति करता है, इसलिए उपरोक्त समाधान में ऑनप्रॉपर्टी चेंज ("Value2FontWeight") पर कॉल कभी निष्पादित नहीं होता है क्योंकि यह जेनरेटेड सेटर में मौजूद नहीं होता है। इनपुट के लिए – MylesRip

0

आपके समाधान, मान अद्यतन नहीं होता है क्योंकि संपत्ति स्वयं "डेटा" के माध्यम से पूरे डेटा संदर्भ के खिलाफ बाध्य है। अभिव्यक्ति। INotifyPropertyChanged कहा जा सकता है, लेकिन इस घटना का मतलब है कि एक ही संपत्ति बदल गई है, और चूंकि आप बाइंडिंग अभिव्यक्ति में कोई संपत्ति नाम प्रदान नहीं करते हैं, इसलिए डेटा बाइंडिंग सिस्टम यह नहीं जानता कि बाध्यकारी को अद्यतन करने की आवश्यकता है - यह नहीं हो सकता देखें कि आपका मूल्य कनवर्टर क्या करता है।

मुझे लगता है कि जेएसप्रैंग का अपरोकरा बहुत कम है, कम से कम नहीं, क्योंकि यह प्रस्तुति तर्क का बेहतर अलगाव प्रदान करता है जिसे मार्कअप से परीक्षण किया जा सकता है। एक स्वच्छ इंटरफ़ेस के साथ आगे बढ़ने के लिए, आप व्यूमोडेल को एक बूलियन प्रॉपर्टी "वैल्यूअरेसम" लागू कर सकते हैं, इसके खिलाफ डेटा-बाइंड, और वास्तविक दृश्य शैली (इस मामले में, एक फ़ॉन्ट वेट) लागू करने के लिए एक मूल्य कनवर्टर का उपयोग करें।

+0

धन्यवाद। जेएसप्रैंग के दृष्टिकोण ने समस्या का समाधान किया और मुझे यूआई में संकेत दिया गया है कि स्थिति के मूल्यांकन को अलग करके इंटरफ़ेस को साफ रखने के लिए आपके सुझाव को पसंद है। – MylesRip

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