2010-06-24 3 views
5

다양한 속성의 두 가지 버전을 비교하고 다른 속성과 굵은 글꼴을 비교하고 싶습니다. SL4는 MultiBinding을 지원하지 않기 때문에 FontWeight를 "."에 바인딩합니다. 전체 데이터 컨텍스트가 변환기로 전달됩니다. 그런 다음 converter 매개 변수를 사용하여 변환기 내에서 비교할 필드를 지정합니다. 지금까지 너무 좋아 ... 일치하지 않는 값은 굵게 표시됩니다.Silverlight 4에서 값 변환기를 사용하여 FontWeight에 바인딩

굵게 표시된 속성은 편집 할 수있는 텍스트 상자에 바인딩되어 있습니다. 값을 편집 할 때 글꼴 크기가 값에 따라 설정되도록 변환기를 "다시 활성화"해야합니다. 이것은 일어나지 않습니다. 이것이 어떻게 성취 될 수 있는가?

참고 : 해당 클래스 및 속성에 대해 이미 INotifyPropertyChanged를 구현했습니다. 값을 변경 한 후 다음 필드로 이동하면 PropertyChanged 이벤트가 발생하지만 실제로 다른 레코드로 이동 한 다음 변경된 레코드로 돌아올 때까지 글꼴 무게는 으로 업데이트되지 않습니다..

는 (나는 또한 그 트릭을 할 것입니다 있는지 확인하기 위해 모드 = 양방향을 사용했습니다. 그러나, 양방향을 당신이 결합 할 때 사용할 수 없습니다 바인딩 ".")

답변

2

당신이 값 변환기를 사용해야합니까? 이 MVVM 패턴을 사용하여 신속하게 시도하고 꽤 잘 작동했습니다. 당신이 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

답변 해 주셔서 감사합니다. (지연된 것에 대해 유감스럽게 생각합니다. 방금 짧지 만 많이 필요한, 휴가로 돌아 왔습니다. :-)) GreenIcicle의 제안과 함께이 접근법을 시도해 보겠습니다. 값 변환기에서 이것을 수행 할 필요는 없습니다. 그러나 저는 RIA Services와 함께이 작업을 시도하고 있습니다. 위에서 RIA 서비스와 함께 MVVM 접근법을 사용할 때주의해야 할 사항이 있습니까? – MylesRip

+0

나는 이것을 시험해 보았고 그것은 나를 위해 일했다. FWIW ... RIA 서비스에서 .shared 코드를 사용하여 위에 정의 된대로 "Value2FontWeight"속성을 내 DTO에 추가 할 수 있습니다 (이 경우 더 이상 엄격한 의미에서 DTO가 아닌 것으로 생각되지만 괜찮습니다).). – MylesRip

+1

FWIW ... RIA 서비스에서이 접근법을 사용하는 데 약간의 문제가있는 것 같습니다 (보기 모델을 사용하지 않는 경우).클라이언트 용으로 생성 된 코드는 속성에 대한 자체 setter 메서드를 제공하므로 위의 솔루션에서 OnPropertyChanged ("Value2FontWeight")에 대한 호출이 생성 된 setter에 없기 때문에 실행되지 않습니다. – MylesRip

0

솔루션은 속성 자체가 "."을 통해 전체 데이터 컨텍스트에 바인딩되기 때문에 값이 업데이트되지 않습니다. 표현. INotifyPropertyChanged가 호출 될 수 있지만이 이벤트는 단일 속성이 변경되었음을 의미하며 바인딩 표현식에 속성 이름을 제공하지 않으므로 데이터 바인딩 시스템은 Binding을 업데이트해야한다는 것을 알지 못합니다. 당신의 가치 변환기가하는 것을 조사하십시오.

마크 업에서 테스트 할 수있는 프리젠 테이션 로직을 더 잘 구분할 수 있기 때문에 JSprang의 appraoch가 훨씬 뛰어나다 고 생각합니다. 깨끗한 인터페이스로 더 나아가려면 ViewModel에 부울 속성 인 "ValuesAreSame"을 구현하고 이에 대해 데이터 바인딩을 수행하고 값 변환기를 사용하여 실제 비주얼 스타일 (이 경우 글꼴 가중치)을 적용 할 수 있습니다.

+0

입력 해 주셔서 감사합니다. JSprang의 접근 방식은이 문제를 해결했으며, UI의 표시 방법과 조건의 평가를 분리하여 인터페이스를 깨끗하게 유지할 것을 제안합니다. – MylesRip

관련 문제