2016-01-14 2 views
0

У меня есть эта простая страница WPF, в которой я добавляю локальный ресурс, который имеет свое определение в бэкэнд-файле страницы.локальный ресурс не отображается на странице WPF

<Page x:Class="WindowsSampleApplication.ValueConverter" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WindowsSampleApplication" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
    Title="ValueConverter"> 
    <Page.Resources> 
     <local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" /> 
    </Page.Resources> 

    <Grid> 
     <StackPanel Margin="10"> 
      <TextBox Name="txtValue" /> 
      <WrapPanel Margin="0,10"> 
       <TextBlock Text="Current value is: " /> 
       <TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock> 
      </WrapPanel> 
      <CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" /> 
     </StackPanel> 
    </Grid> 
</Page> 

и это файл бэкенд для Page

namespace WindowsSampleApplication 
{ 
    public partial class ValueConverter : Page 
    { 
     public ValueConverter() 
     { 
      InitializeComponent(); 
     } 
     public class YesNoToBooleanConverter : IValueConverter 
     { 
      public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      { 
       switch (value.ToString().ToLower()) 
       { 
        case "yes": 
         return true; 
        case "no": 
         return false; 
       } 
       return false; 
      } 

      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      { 
       if (value is bool) 
       { 
        if ((bool)value == true) 
         return "yes"; 
        else 
         return "no"; 
       } 
       return "no"; 
      } 
     } 
    } 
} 

Я правильно включены имен WindowsSampleApplication в Page уровне и то же пространство имен имеет определение для моего ресурса. Но я получаю ниже error когда добавил, что local resource

Error Image

Я только начал с WPF учебники из here, но единственное, что я пытался, а не следовать учебник был я добавил страницу вместо Окно, так как я создал Window уже с более ранними демонстрациями, указанными там, и, надеюсь, я преобразовал все, что Page должно быть вместо Window. У кого-нибудь есть идея о том, как решить эту проблему?

UPDATE

Я также попытался обертывание <local..../> жгутов <ResourceDictionary> я готов его в SO, но не много пользы и ошибок все еще остается, как есть.

ответ

1

Я думаю, что проблема заключается в том, что вы вложили свой конвертер внутри страницы ValueConverter.

[EDIT]

Там нет никакой возможности Instantiate вложенных классов, так что единственный вариант будет объявить класс преобразования непосредственно в WindowsSampleApplication пространства имен.

обновленный код

namespace WindowsSampleApplication 
{ 
    public partial class ValueConverter : Page 
    { 
     public ValueConverter() 
     { 
      InitializeComponent(); 
     } 
     //Removed from here 
    } 
    public class YesNoToBooleanConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      switch (value.ToString().ToLower()) 
      { 
       case "yes": 
       case "oui": 
        return true; 
       case "no": 
       case "non": 
        return false; 
      } 
      return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value is bool) 
      { 
       if ((bool)value == true) 
        return "yes"; 
       else 
        return "no"; 
      } 
      return "no"; 
     } 
    } 
} 
+0

Хорошо, тогда он говорит ** Вложенные свойства не поддерживаются ** .. :( –

+0

Ах, моя ошибка! Вы не можете использовать вложенные классы вообще. Просто попробуйте объявить конвертер непосредственно в пространстве имен WindowsSampleApplication. сделаю, я изменю свой ответ –

+0

Бадди .. Это фактический ответ .. Я потерял класс конвертера внутри 'ValueConverter' путем надзора. Они правильно задали ** DEMO **. Фактически он должен быть снаружи. Я тоже нашел это. Пожалуйста, уточните ответ, и я соглашусь с ним ... :) Спасибо за ваше время. –

1

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

Ваш пользовательский класс должен быть общедоступным и поддерживать общедоступный конструктор по умолчанию (без параметров). (Смотрите примечания относительно структур.) Ваш собственный класс не должен быть вложенным классом. Вложенные классы и «точка» в их общем синтаксисе использования CLR мешают другим функциям WPF и/или XAML, таким как прикрепленные свойства.

Ссылка:

https://msdn.microsoft.com/en-us/library/ms753379(v=vs.100).aspx

+0

Спасибо за ваше время .. Я бы предложил сделать объяснения короткими и приятными, то есть встать только с важными моментами, а затем предоставить источник .. :) В любом случае .. +1 за ваше время .. :) –

3

Поскольку это выглядит как будто вы только пробуете WPF, и вы поставите конвертер в коде без всякой особой причины, я бы рекомендовал обычный путь преобразователи:

Создать новый каталог Преобразователи в проект WindowsSampleApplication. Затем добавьте новый файл класса для каждого конвертера ...

Теперь вы знаете, где найти конвертеры и сможете их легко использовать.

PS: В качестве вложенного класса можно преобразовать конвертер в код, но у вас должна быть повод для этого. (Binding converter as inner class?)

+0

Да, спасибо .. Хорошо проблема была чем-то другим .. Спасибо за то, что я появился с новой идеей .. :) +1 для этого .. –

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