2014-10-15 3 views
1

После поиска и тестирования нескольких вариантов за последнюю неделю я не могу найти то, что я ищу; может быть, кто-то здесь может помочь. Прочитав это, пожалуйста, имейте в виду, что я пытаюсь использовать MVVM как можно более строго, хотя я относительно новичок в WPF. В качестве примечания, я использую Mahapps.Metro для создания моего окна и элементов управления, найденного here.IsChecked имеет значение false

У меня есть файл XML, который мое приложение использует для конфигурации (я не могу использовать файл app.config, потому что приложение не может установить систему пользователей). Приложение будет искать этот файл при запуске, и если он не найдет файл, он его создаст. Ниже приведен фрагмент из XML:

<?xml version="1.0" encoding="utf-8"?> 
<prefRoot> 
    <tabReport> 
    <cbCritical>True</cbCritical> 
    </tabReport> 

я ссылку на файл XML в моем Window.Resources:

<Controls:MetroWindow.Resources> 
     <XmlDataProvider x:Key="XmlConfig" 
         Source="%appdata%\Vulnerator\Vulnerator_Config.xml" 
         XPath="prefRoot" 
         IsAsynchronous="False" 
         IsInitialLoadEnabled="True"/> 
</Controls:MetroWindow.Resources> 

И использовать это как DataContext для моего MainWindow:

<Controls:MetroWindow DataContext="{DynamicResource XmlConfig}"> 

Далее я установить преобразователь «строка-в-bool»:

class StringToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null) 
     { 
      bool? isChecked = (bool?)value; 
      return isChecked; 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value != null) 
     { 
      string isChecked = value.ToString(); 
      return isChecked; 
     } 
     return string.Empty; 
    } 
} 

Наконец, я связываю IsChecked к соответствующему XPath:

<Checkbox x:Name="cbCritical" 
      Content="Critical" 
      IsChecked="{Binding XPath=//tabReport/cbCritical, 
         Converter={StaticResource StringToBool}}" /> 

После всего этого, в applciation нагрузок, но IsChecked установлен в false ... Любые и все идеи были бы полезны здесь; заранее спасибо!

+0

Ваши методы должны возвращать объект вместо прямого bool или строки? – WhoIsRich

+0

Включили ли вы конвертер в раздел ресурсов? –

+0

Как конвертер уровня приложения для вашего XML bool для строки MVVM? Ваше приложение не должно знать ничего о том, как хранятся ваши данные. –

ответ

0

Две вещи:

  1. Ваш конвертер было бы лучше, чтобы не возвращать нуль, но false по умолчанию. Если преобразование не выполняется по какой-либо причине, верните фактическое значение.
  2. Код (bool?)value не преобразует строку в булево. Измените его на:

return (value.ToLower() == "true").

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