2017-01-16 5 views
0

У меня проблема с преобразованием строки в значок. Икона Геометрия находится в ResourceDictionary. ValueConverter не вызывается (я пытался отлаживать метод конвертации конвертера). Вот мой код:C# WPF Binding Path Data с конвертером

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

Вы не привязываетесь ни к чему. Вы должны сообщить Binding, чтобы перейти к Window, чтобы найти Status. Рекомендуемый способ сделать это состоит в использовании RelativeSource, как показано ниже:

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

Как @Clemens заметки, UpdateSourceTrigger=PropertyChanged не имеет никакого смысла на эту привязку и не должно быть. Этот атрибут сообщает Binding, когда он должен обновить свойство источника привязки. Свойство источника - Window.Status, в данном случае.

Однако имущество Path.Data не обновляет имущество, на которое оно связано. A Path отображает Geometry; он не редактирует Geometry. UpdateSourceTrigger существует для свойств управления, которые обновляют свойства viewmodel, такие как TextBox.Text. Это наиболее распространенное использование для UpdateSourceTrigger=PropertyChanged: По умолчанию TextBox.Text обновляет свойство source, когда TextBox теряет фокус, но иногда вы хотите, чтобы он обновлялся при каждом нажатии клавиши.

+1

спасибо, что хорошо работает сейчас – MrWoffle

0

Установите DataContext окна к себе для связывания для работы и метод Convert преобразователя для дозвонились :

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

Если привязка к исходному свойству не выполняется, конвертер никогда не будет вызываться.

Смежные вопросы