2017-01-16 15 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:バインディングが動作するために自分自身へのウィンドウのDataContextのと呼ばれる取得するために、コンバータの変換方法を設定し

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

あなたは何かに縛られていません。 Statusプロパティを見つけるには、BindingWindowに行く必要があります。それを行うための推奨される方法は以下のように、RelativeSourceを使用することです:ノートを@Clemens

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

として、UpdateSourceTrigger=PropertyChangedが結合この上の任意の意味をなさないとがあってはなりません。その属性は、バインディングのsourceプロパティを更新する必要があるときにBindingに通知します。 sourceプロパティはWindow.Statusです。

ただし、Path.Dataプロパティは、バインドされているプロパティを更新しません。 PathGeometryを表示します。 Geometryは編集しません。 TextBox.Textのように、viewmodelプロパティを更新するコントロールプロパティの場合はUpdateSourceTriggerが存在します。 UpdateSourceTrigger=PropertyChangedの場合は、これが最も一般的です。TextBox.Textは、TextBoxがフォーカスを失ったときにソースプロパティを更新しますが、各キーストロークで更新することが必要な場合があります。

+1

ありがとうございました – MrWoffle

0

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

ソースプロパティへのバインドに失敗した場合、コンバータは決して呼び出されません。

関連する問題