2015-08-10 5 views
3

Я попытался привязать видимость нескольких кнопок к некоторым логическим точкам в режиме просмотра и заставить работать в режиме разработки. Я делал это несколько раз и никогда не испытывал проблем, но теперь это не сработает, и я не знаю, почему. Обратите внимание, что при работе приложения все работает .MVVM Binding не работает во время разработки

Я извлек суть в отдельное приложение, и оно все еще не работает!

Мой XAML:

<Window x:Class="BindingTest.MainWindow" 
     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:bindingTest="clr-namespace:BindingTest" 
     Title="MainWindow" Height="350" Width="525" 
     mc:Ignorable="d" 
     d:DataContext="{d:DesignInstance bindingTest:TestViewModel, d:IsDesignTimeCreatable=true}"> 
    <Grid> 
     <Grid.Resources> 
      <BooleanToVisibilityConverter x:Key="BoolToVis"/> 
     </Grid.Resources> 
     <StackPanel> 
      <Button Visibility="{Binding IsButton1Visible, Converter={StaticResource BoolToVis}}">Hallo 1</Button> 
      <Button Visibility="{Binding Button2Visibility}">Hallo 2</Button> 
      <Button>Hallo 3</Button> 
     </StackPanel> 
    </Grid> 
</Window> 

Мой ViewModel:

public class TestViewModel 
{ 
    public bool IsButton1Visible 
    { 
     get { return true; } 
    } 

    public Visibility Button2Visibility 
    { 
     get { return Visibility.Hidden; } 
    } 
} 

Чтобы заставить его работать в реальном приложении, я добавил к конструктору XAML:

DataContext = new TestViewModel(); 

Этот все довольно просто, но почему это не работает в дизайнере? Я всегда получал это, чтобы работать в прошлом, и теперь я пытался часами ... Это не единственное обязательство, не работающее, но почему это даже не работает?

Ожидаемый результат:

  • Button1 видна
  • Button2 скрытый
  • Button3 видимую

Результат в конструкторе:

  • Button1 рухнул
  • Button2 видна
  • Button3 видна
+0

В вашей модели ViewModel не отображается тип Boolean, но вид. –

+1

@ E-Bat, посмотрите еще раз ... – elgonzo

+0

Я просто добавил Видимость, чтобы проверить, будет ли хотя бы _something_ работать. Но даже привязка видимости не работает так, как ожидалось ... – JCH2k

ответ

4

UPDATE: Проблемы время разработки DataContext привязки не работают из-за ошибочное использование префикса d: пространства имен для IsDesignTimeCreatable собственности.

Таким образом, измените

d:IsDesignTimeCreatable=True 

в

IsDesignTimeCreatable=True 

и все должно быть хорошо. (Мой отчет об ошибке, поданной с MS будет обновляться с этой информацией, а также.)


Поскольку эта проблема с дизайн-время DataContext привязок не работает последовательно воспроизводимость в VS2015, а также VS2013 когда IsDesignTimeCreatable является префикс с пространством имен d: (см. комментарии ниже вопроса), я решил отправить отчет об ошибке в Microsoft: Issue #1651633 "WPF designer: Designtime DataContext bindings broken?".

Посмотрите, как Microsoft будет следить за этой проблемой. Он должен быть рассмотрен, так как такая проблема может уловить разработчика вне охранника и заставить его переустановить Visual Studio без каких-либо преимуществ ...;)

+2

Не могу поверить! Это действительно смешно! Почему в обоих пространствах имен есть _IsDesignTimeCreatable_? Большое спасибо за ваши усилия! – JCH2k

+0

@ JCH2k, в определенных ситуациях есть необходимость: * D: IsDesignTimeCreatable * - [см. Здесь пример] (http://blogs.msdn.com/b/unnir/archive /2009/07/12/introducing-sample-data-for-developers.aspx) с использованием типизированного шаблона данных.Я бы ожидал, что синтаксический анализатор XAML не просто проглатывает * d: IsDesignTimeCreatable * для * DesignInstance *, а молчаливо использует только значение по умолчанию IsDesignTimeCreatable * (false). Скорее, в отношении * DesignInstance * я бы хотел, чтобы синтаксический анализатор обеспечивал правильное использование * IsDesignTimeCreatable * или обрабатывал свойство с помощью или без 'd:'. – elgonzo

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