2013-02-26 2 views
1

У меня есть тест WPF окно с ниже XAML:Видимость типа преобразователя не вызывается

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfApplication2="clr-namespace:WpfApplication2" 
     xmlns:test="clr-namespace:WpfApplication2.Properties" 
     DataContext="{Binding Path=TestClass}" 
     Title="MainWindow" Height="350" Width="525" > 

    <Window.Resources> 
     <wpfApplication2:TestTypeConverter x:Key="TestConverter"/> 
    </Window.Resources> 

    <Grid> 
     <Grid Visibility="{Binding TestProperty, Converter={StaticResource TestConverter}, ConverterParameter='nottest'}"> 
      <Label Content="Test Label"></Label> 
     </Grid> 
    </Grid> 
</Window> 

У меня есть тестовый класс типа преобразователя, который ниже:

using System; 
using System.Globalization; 
using System.Windows.Data; 

namespace WpfApplication2 
{ 
    class TestTypeConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var valueToTest = (string) value; 
      var parameterToCheck = (string) parameter; 

      return valueToTest == parameterToCheck ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return value; 
     } 
    } 
} 

TestClass находится ниже :

using System.ComponentModel; 
using System.Runtime.CompilerServices; 
using WpfApplication2.Annotations; 

namespace WpfApplication2 
{ 
    public class TestClass : INotifyPropertyChanged 
    { 
     public TestClass() 
     { 
      TestProperty = "test"; 
     } 

     private string _testProperty; 
     public string TestProperty 
     { 
      get { return _testProperty; } 
      set 
      { 
       if (_testProperty == value) 
       { 
        return; 
       } 
       _testProperty = value; 
       OnPropertyChanged(); 
      } 
     } 


     public event PropertyChangedEventHandler PropertyChanged; 

     [NotifyPropertyChangedInvocator] 
     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      var handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Свойство видимости не зависит от типа преобразователя, а сам метод преобразования не является даже будучи вызванным (я поставил точку останова, которая не попадает).

Что я делаю неправильно?

Благодаря

+0

Что находится в 'DataContext' окна? –

+0

DataContext окна теперь является классом TestClass, который я добавил. Это свойство называется TestProperty, с которым я пытаюсь привязываться. – JMK

ответ

2

Ваше связывание кажется неправильным:

Visibility="{Binding 'test', Converter={StaticResource TestConverter}, ConverterParameter='nottest'}" 

изменить его:

Visibility="{Binding test, Converter={StaticResource TestConverter}, ConverterParameter='nottest'}" 

Если тест свойство не существует, ни один преобразователь не будет называться

+0

Должны ли тесты быть собственностью? Я не могу передать фактическое значение в качестве значения? – JMK

+0

'test' будет интерпретироваться как * имя свойства *. Поэтому я сомневаюсь в добавлении или пропуске тиков вокруг, что будет иметь значение. –

+0

@JMK: Если вы передаете фактическое значение, вам не нужна привязка ... – thumbmunkeys

1

Создать ресурс для параметра преобразователя (как показано в нижеприведенном фрагменте), и используйте ресурс как преобразователь параметров вместо буквального

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:wpfApplication2="clr-namespace:WpfApplication2" 
     xmlns:test="clr-namespace:WpfApplication2.Properties" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     DataContext="{Binding Path=TestClass}" 
     Title="MainWindow" Height="350" Width="525" > 
    <Window.Resources> 
     <wpfApplication2:TestTypeConverter x:Key="TestConverter"/> 
<sys:String x:Key="converterParam">nottest</sys:String> 
    </Window.Resources> 

    <Grid> 
     <Grid Visibility="{Binding TestProperty, Converter={StaticResource TestConverter}, ConverterParameter={StaticResource converterParam}"> 
      <Label Content="Test Label"></Label> 
     </Grid> 
    </Grid> 
</Window> 
0

Просто опустить имя собственности в целом, если у вас нет DataContext, и он будет работать, Следующие wroked для меня.

Видимость = "{Binding конвертер = {StaticResource myTestConverter}}"

// посмотреть, как конвертер ключевого слова следует Binding ключевое слово, и я не указать имя свойства после связывания ключевого слова.

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