2017-01-16 41 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

你对任何东西都没有约束力。您需要告诉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;它不编辑GeometryUpdateSourceTrigger存在用于更新视图模型属性的控件属性,如TextBox.Text。这是UpdateSourceTrigger=PropertyChanged最常用的用法:默认TextBox.TextTextBox失去焦点时更新源属性,但有时您希望它在每次击键时更新。

+1

谢谢你现在工作正常 – MrWoffle

0

设置窗口的DataContext本身的结合工作和转换器的转换方法被调用:

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

如果绑定到源属性失败,转换器将永远不会被调用。