2017-01-16 2 views
0

문자열을 아이콘으로 변환하는 데 문제가 있습니다. Geometry 아이콘은 ResourceDictionary에 있습니다. ValueConverter 호출되지 않습니다 (나는 변환기의 변환 방법에서 디버깅을 시도 함).C# WPF 변환기로 바인드 경로 데이터

XAML :

<Window.Resources> 
    <local:StatusToPathDataConverter x:Key="PathConverter"/> 
</Window.Resources> 
<Grid> 
    <Path Width="20" 
     Height="20" 
     Stretch="Uniform" 
     Fill="Black" 
     Data="{Binding Path=Status, 
      UpdateSourceTrigger=PropertyChanged, 
      Converter={StaticResource PathConverter}}"/> 
</Grid> 

CS :

public partial class MainWindow :Window { 
    public MainWindow() { 
     InitializeComponent(); 
    } 

    public string Status 
    { 
     get { return (string)GetValue(StatusProperty); } 
     set { SetValue(StatusProperty, value); } 
    } 

    public static readonly DependencyProperty StatusProperty = 
     DependencyProperty.Register("Status", typeof(string), typeof(MainWindow)); 


} 
public class StatusToPathDataConverter :IValueConverter { 
    private static ResourceDictionary iconDictionary; 
    public ResourceDictionary IconDictionary 
    { 
     get 
     { 
      if(iconDictionary == null) { 
       iconDictionary = new ResourceDictionary(); 
       iconDictionary.Source = new Uri("/WPFBindingTest;component/Resources/IconDictionary.xaml", UriKind.RelativeOrAbsolute); 
      } 
      return iconDictionary; 
     } 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     var status = (string)value; 
     if(statinStatus == null) 
      return null; 
     switch(status.ToLower()) { 
      case "test": 
       return IconDictionary["TestIcon"]; 
       // ... 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 
} 

답변

1

당신은 어떤 것에도 구속력이 없습니다. BindingWindow으로 이동하여 Status 속성을 찾아야합니다. 그렇게하기 위해 권장되는 방법은 다음과 같습니다, RelativeSource을 사용하는 것입니다 : 메모를 @Clemens

<Path 
    Width="20" 
    Height="20" 
    Stretch="Uniform" 
    Fill="Black" 
    Data="{Binding Path=Status, 
     RelativeSource={RelativeSource AncestorType=Window}, 
     Converter={StaticResource PathConverter}}" 
     /> 

으로 UpdateSourceTrigger=PropertyChanged 바인딩이 아무 의미가 없습니다 및 없을 것이다. 이 속성은 Binding에게 바인딩의 소스 속성을 업데이트해야하는시기를 알려줍니다. 이 경우 source 속성은 Window.Status입니다.

그러나 Path.Data 속성은 바인딩 된 속성을 업데이트하지 않습니다. PathGeometry을 표시합니다. Geometry을 수정하지 않습니다. TextBox.Text과 같이 viewmodel 속성을 업데이트하는 컨트롤 속성에는 UpdateSourceTrigger이 있습니다. UpdateSourceTrigger=PropertyChanged의 가장 일반적인 용도입니다. TextBox.Text은 기본적으로 TextBox이 포커스를 잃을 때 소스 속성을 업데이트하지만 가끔씩 각 키 입력에서 업데이트하려고합니다.

+1

감사합니다. – MrWoffle

0

일을하고 컨버터의 변환 방법에 바인딩을위한 자체에 윈도우의 DataContext를 설정 전화를받을 수 여기 내 코드입니다 :

public MainWindow() { 
    InitializeComponent(); 
    DataContext = this; 
} 

원본 속성에 바인딩하지 못하면 변환기가 호출되지 않습니다.

관련 문제