2015-10-22 3 views
1

Я разрабатываю Windows 10 Universal App. У меня есть код ниже:Катастрофический сбой при привязке xaml

XAML:

<Page 
    x:Class="MyProject.BlankPage1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:MyProject" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas Background="Purple"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemContainerStyle> 
      <Style TargetType="ContentPresenter"> 
       <Setter Property="Canvas.Left" Value="{Binding X}"/> 
       <Setter Property="Canvas.Top" Value="{Binding Y}"/> 
      </Style> 
     </ItemsControl.ItemContainerStyle> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Rectangle Fill="Red" Width="50" Height="50"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Page> 

и код позади:

namespace MyProject 
{ 
    public sealed partial class BlankPage1 : Page 
    { 
     public BlankPage1() 
     { 
      DataContext = 
       new[] 
       { 
        new { X = 50.0, Y = 100.0 }, 
        new { X = 220.0, Y = 170.0 } 
       }; 
      InitializeComponent(); 
     } 
    } 
} 

Unfortunatelly, прямоугольники не отображается в окне. Я получаю ошибку компиляции:

Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)) 

Назначение координат холста статические числа в xaml работает, как ожидалось.

Почему возникает ошибка и код не работает?

+0

Вам не хватает привязки ItemsSource для вашего элемента ItemsControl. Хотя установка DataContext в массив также несколько нечетна; Я только предполагаю, что для тестирования? –

+0

Конечно, это было, спасибо за ваш совет. – pt12lol

+0

Просьба уточнить: проблема все еще возникает, когда вы добавили привязку 'ItemsSource' к вашему элементу управления? Если да, попробовали ли вы использовать именованный тип вместо анонимного типа? Например. 'Tuple ' или ваш собственный пользовательский тип? Вы пробовали увидеть «Canvas.Left» и «Canvas».Top' в 'ItemTemplate' вместо стиля презентатора контента? –

ответ

1

Я просто наткнулся на эту проблему самостоятельно, создав приложение Universal Platform для Windows.

Был ли поиск по поисковой системе, найденный this артикул.

Было очень полезно. Я скопировал его класс SetterValueBindingHelper в свой собственный проект. После этого я сделал 1 регулировки, потому что

type = System.Type.GetType(item.Type).GetTypeInfo(); 

дал исключение, когда вы делаете Type="Canvas" в привязке XAML. Сначала он пытается найти класс Canvas в текущей сборке. Это возвращает null, а затем он вызывает .GetTypeInfo(), бросая исключение NullReferenceException.

Внедрен новый C12 6.0 Null-Conditional Operator, и это решило эту проблему. Код сразу после проверки, если type имеет значение NULL, а затем проходит через все загруженные сборки, чтобы найти Canvas.

type = System.Type.GetType(item.Type)?.GetTypeInfo(); 

Его второй пример использования является ни странно, непосредственно связанные с использованием его с Canvas элемента.

Another example from my Project VisualDesigner:

Вот мой окончательный XAML, основанный на его примере:.

<ItemsControl Grid.Column="1" ItemsSource="{Binding CanvasItems}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="ContentPresenter"> 
      <Setter Property="helpers:SetterValueBindingHelper.PropertyBinding"> 
       <Setter.Value> 
        <helpers:SetterValueBindingHelper> 
         <helpers:SetterValueBindingHelper Type="Canvas" Property="Left" Binding="{Binding WindowX, Mode=TwoWay}" /> 
         <helpers:SetterValueBindingHelper Type="Canvas" Property="Top" Binding="{Binding WindowY, Mode=TwoWay}" /> 
        </helpers:SetterValueBindingHelper> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <applicationwindow:ApplicationWindow Width="{Binding WindowWidth}" Height="{Binding WindowHeight}" DataContext="{Binding}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

helpers: относится к пространстве имен SetterValueBindingHelper находится в ApplicationWindow в моем случае обычай UserControl. CanvasItems является ObservableCollection<ApplicationWindowViewModel>, и это мой ApplicationWindowViewModel:

[ImplementPropertyChanged] 
public class ApplicationWindowViewModel : ViewModelBase 
{ 
    public string Title { get; set; } 

    public double WindowX { get; set; } = 10; 

    public double WindowY { get; set; } = 10; 

    public int WindowWidth { get; set; } = 300; 

    public int WindowHeight { get; set; } = 200; 
} 

В этом примере я использую Fody.PropertyChanged обрабатывать свойство изменилось события на X/Y/ширина/высота свойства, если вы не используете этот пакет, не забудьте реализовать собственные обработчики событий PropertyChanged и т. д.