2011-03-21 3 views
1

안녕하세요
일부 환경 변수에 따라 속성을 변경하려고하는데 datacontext의 각 컨트롤에 대한 속성을 만들지 않으려합니다. 따라서 변환기를 사용하는 것이 좋습니다. 컨트롤 이름에 따라 속성을 설정합니다. 목표는 모든 컨트롤에 대해 하나 개의 속성을 사용하는 것입니다WPF : 여러 컨트롤이 동일한 속성에 바인딩됩니다.

<Grid.Resources> 
    <local:NameToStringConverter x:Key="conv" />  
</Grid.Resources> 

<TextBlock Name="FordPerfect" 
    Text="{Binding ElementName="FordPerfect" Path=Name, Converter={StaticResource conv}, Mode=OneWay}"/> 
<TextBlock Name="Arthur" 
    Text="{Binding ElementName="Arthur" Path=Name, Converter={StaticResource conv}, Mode=OneWay}"/> 
<TextBlock Name="ZaphodBeeblebrox" 
    Text="{Binding ElementName="ZaphodBeeblebrox" Path=Name, Converter={StaticResource conv}, Mode=OneWay}"/> 

및 ...

public class NameToStringConverter : IValueConverter 
{ 
    public object Convert(
    object value, Type targetType, 
    object parameter, CultureInfo culture) 
    {    
     if (MyGlobalEnv.IsFlavor1 && ((string)value).Equals("ZaphodBeeblebrox")) return "42" 
     if (MyGlobalEnv.IsFlavor2 && ((string)value).Equals("ZaphodBeeblebrox")) return "43" 
     if (MyGlobalEnv.IsFlavor1 && ((string)value).Equals("Arthur")) return "44" 

     return "?"; 
    } 

    public object ConvertBack(
    object value, Type targetType, 
    object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException("Cannot convert back"); 
    } 
} 

내가 더 나은 더 우아한 방법이있을거야 ... 어떤 아이디어?

+0

나는 그것을 얻지 않는다. TextBox.Text를 "?"로 설정하려고합니다. 그 TextBox.Name == "6 * 9"를 제외하고는 "42"가 될 것입니다. ?? 그것을 할 수있는 많은 방법이 있으며, 대부분은 덜 혼란 스럽습니다. ('명백한'이라고 말할 것입니다 ...). 진정한 목표를 말씀해주세요! –

+0

@Markus 2가 더 좋아? –

답변

1

데이터 바인딩의 한 점은 UI (XAML)와 코드 (CS)를 분리하는 것입니다. 여기에 코드와 UI가 너무 밀접하게 묶여있어서 데이터 바인딩을 통해이 작업을 수행하려고하면 실제로 아무 것도 사지 않습니다. 데이터 값을 취하여 각 컨트롤에 올바르게 적용하는 방법을 작성하여 단순화 할 수 있습니다. - 여전히 단단히 결합 (불량)되었지만 적어도 코드는 응축되어 있고 쉽게 따라갈 수 있습니다 (덜 나쁘지 않음).

비록 당신이해야 할 일은 컨트롤 이름에 의존하지 않고 ConverterParameter를 정의하는 것입니다. 이 문서 당신은 당신의 상황에서 환경 변수에 직접 결합 할 수있다 http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters

+0

나는 더 우아한 뭔가가 있다는 것을 알았습니다 ... : 10x. (BTW OneWay는 문제가 아니었다 ...) –

0

의 아래쪽 1/3을 참조하십시오

<Window xmlns:system="clr-namespace:System;assembly=mscorlib" ...> 
<TextBlock Text="{Binding Source={x:Static system:Environment.OSVersion}}"/> 
관련 문제