2017-01-16 56 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; 
} 

如果綁定到源屬性失敗,轉換器將永遠不會被調用。