2010-06-24 21 views
5

Çeşitli özelliklerin iki sürümünü karşılaştırmak ve diğerine eşit değilse onlardan birini kalınlaştırmak istiyorum. SL4 MultiBinding'i desteklemediğinden, FontWeight'ı "." Olarak bağlarım. Böylece tüm veri içeriği dönüştürücüye iletilir. Ardından dönüştürücü içinde hangi alanların karşılaştırılacağını belirlemek için dönüştürücü parametresini kullanırım. Şimdiye kadar, çok iyi ... Eşleşmeyen değerler kalındır. Sorun, kalınlaştırılmış özelliğin düzenlenebilen bir metin kutusuna bağlı olmasıdır. Değer düzenlendiğinde, dönüştürücünün "yeniden etkinleştirilmesini" istiyorum, böylece yazı tipi ağırlığı yeni değerine göre ayarlanır. Bu olmaz. Bu nasıl yapılabilir?Silverlight 4'teki FontWeight öğesinin bir değer dönüştürücüsüyle bağlanması

Not: Zaten ilgili sınıf ve özellikler için INotifyPropertyChanged uygulamıştım. Değeri değiştirdikten sonra bir sonraki alana sekme özelliği, PropertyChanged olayının tetiklenmesine neden olur, ancak yazı tipi ağırlığı farklı bir kayda geçene kadar güncelleştirilmez ve ardından değiştirilen kayıtlara geri dönülür.

(Ben de o hile yapacağını görmek için Mod = TwoWay kullanarak çalıştı. Ancak, TwoWay sen bağlanarak zaman kullanılamaz bağlayıcı "")

cevap

2

Bir Değer Converter kullanımı GEREKİYOR musunuz? MVVM desenini kullanarak bunu çabucak denedim ve gayet iyi çalıştı. Eğer MVVM kullanmak olsaydı, böyle yapmak mümkün olabilir:

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

Yanıtınız için teşekkür ederiz. (Gecikme için özür dilerim. Kısa, ama çok ihtiyaç duyulan bir tatilden yeni döndüm. :-)) GreenIcicle'ın önerisi ile birlikte bu yaklaşımı deneyeceğim. Bunu bir değer dönüştürücüsünde yapmak şart değildir. Bununla birlikte, bunu DEA Hizmetleri ile bağlantılı olarak yapmaya çalışıyorum. RIA Hizmetleri ile birlikte yukarıda açıkladığınız gibi MVVM yaklaşımı kullanırken bilmem gereken herhangi bir uyarı var mı? – MylesRip

+0

Bunu denedim ve benim için çalıştı. FWIW ... DEA Hizmetlerinde "Value2FontWeight" özelliğini (yukarıda tanımlandığı gibi) DTO'ma ekleyebilmek için .shared kodunu kullanabilirim (bu durumda, en katı anlamda bir DTO olmadığı varsayılırsa da, tamamdır)). – MylesRip

+1

FWIW ... Bu yaklaşımın RIA Servisleri ile kullanılmasında küçük bir problem var gibi görünüyor (eğer bir görünüm modeli kullanmıyorsanız).İstemci için oluşturulan kod, özellikler için kendi ayarlayıcı yöntemlerini sağlar, bu nedenle yukarıdaki çözümde OnPropertyChanged ("Value2FontWeight") çağrısı, oluşturulan ayarlayıcıda bulunmadığı için hiçbir zaman yürütülmez. – MylesRip

0

çözüm, özellik "." ile tüm veri bağlamına bağlı olduğu için değer güncellenmez. ifadesi. INotifyPropertyChanged çağrılabilir, ancak bu olay, tek bir özelliğin değiştiğini ve ciltleme ifadesinde bir özellik adı sağlamadığınızdan, veri bağlama sisteminin Bağlama'nın güncellenmesi gerektiğini bilmediğini belirtir. Değer dönüştürücünüzün neye benzediğine bakın.

JSprang'ın appraoch'ının çok daha iyi olduğunu düşünüyorum, en azından markörden test edilebilen sunum mantığının daha iyi ayrılmasını sağladığı için değil. Temiz bir arayüzle daha ileri gitmek için, ViewModel'ın bir "boyar" özelliği "ValuesAreSame" uygulayabilmesine, buna karşı veri bağlamasına ve gerçek görsel stili uygulamak için bir değer dönüştürücüsünü kullanmanıza izin verebilirsiniz (bu durumda, bir font ağırlığı).

+0

Giriş için teşekkürler. JSprang'ın yaklaşımı sorunu çözdü ve önerinin, durumun değerlendirmesini UI'de nasıl gösterildiğinden ayırarak arabirimi temiz tutmasını seviyorum. – MylesRip

İlgili konular