2016-01-15 2 views
0

Я обновил проект WPF до .NET 4.5.2. В файле xaml у меня есть следующая строка.Обновление WPF с .NET 4 до 4.5.2, DataGridTextColumn Видимость DataContext ссылка сломана

<UserControl 
     x:Class="Casa.Project.Client.Views.Projects.ProjectSearch" 
     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:controls="clr-namespace:Casa.Project.Core.Wpf.Controls;assembly=Casa.Project.Core.Wpf" 
     mc:Ignorable="d" 
     d:DesignWidth="700" 
     x:Name="ProjectSearchWindow" 
    > 
<UserControl.Resources> 
<DataGridTextColumn x:Key="PlanNumberColumn" Header="Project #" Visibility="{Binding DataContext.ShowPlanNumber, Source={x:Reference ProjectSearchWindow}}" Binding="{Binding ProjectNumber}" /> 

...

ReSharper подчеркивает всю видимость метки, говоря «Ссылка на объект не указывает на экземпляр объекта», который производит ошибку. Когда я загружаю старый проект, который нацелен на .NET 4, эта ошибка не существует.

Когда я фактически запускаю проект, вся таблица, использующая DataGridTextColumn, не показывает никаких значений (которые загружаются должным образом).

Есть ли какие-то изменения, произошедшие с .NET 4 до .NET 4.5.2, что приводит к такому поведению? Как это исправить?

ответ

0

Так что я не понял, почему обновление сломало его, но я выяснил способ заставить его работать.

Класс Freezable имеет возможность передавать DataContext, хотя он не является частью визуального/логического дерева. Мы используем это для этого исправления.

шаги

Во-первых, создать класс, который наследуется от Freezable

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

Во-вторых, падение <helpers:BindingProxy x:Key="proxy" Data="{Binding}" /> прямо вокруг DataGridTextColumn годов. Измените локально на пространство имен вашего класса BindingProxy. Измените DataGrid, чтобы он соответствовал тегу root xaml. Импорт пространства имен для вашего BindingProxy в файл XAML, если это необходимо (например, xmlns:helpers="clr-namespace:Casa.Project.Client.Helpers")

<DataGrid.Resources> 
    <helpers:BindingProxy x:Key="proxy" Data="{Binding}" /> 
    <DataGridTextColumn x:Key="PlanNumberColumn" Header="Project #" Visibility="{Binding Data.ShowPlanNumber, Source={StaticResource proxy}}" Binding="{Binding ProjectNumber}" /> 
</DataGrid.Resources> 

Окончательная состояние кода примерно

<UserControl 
     x:Class="Casa.Project.Client.Views.Projects.ProjectSearch" 
     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:helpers="clr-namespace:Casa.Project.Client.Helpers" 
     xmlns:controls="clr-namespace:Casa.Project.Core.Wpf.Controls;assembly=Casa.Project.Core.Wpf" 
     mc:Ignorable="d" 
     d:DesignWidth="700" 
     x:Name="ProjectSearchWindow" 
    > 
<UserControl.Resources> 
    <helpers:BindingProxy x:Key="proxy" Data="{Binding}" /> 
    <DataGridTextColumn x:Key="PlanNumberColumn" Header="Project #" Visibility="{Binding DataContext.ShowPlanNumber, Source={x:Reference ProjectSearchWindow}}" Binding="{Binding ProjectNumber}" /> 

Источник: http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

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

  • Нет связанных вопросов^_^