簡體   English   中英

將依賴項屬性綁定到自定義控件

[英]Binding Dependency Properties to Custom Controls

我正在使用大量使用數據網格的WPF應用程序。 我經常遇到一種情況,該情況要求我在數據網格內使用自定義控件。 當然,綁定的數據對於每一行都是不同的。

我解決該問題的方法是制作一個類型為DataGridTemplateColumn的自定義控件,並向其添加我自己的依賴項屬性。 然后,當我需要在網格中使用此列類型時,可以一行完成。

似乎自定義控件的數據上下文已經不合時宜了。

現在,我有以下代碼...

DataGridCheckedComboColumn.xaml

<DataGridTemplateColumn x:Class="DataTracker.Presentation.GridControls.Views.DataGridCheckedComboColumn"
                        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:ccb="clr-namespace:CheckedComboBoxControl;assembly=CheckedComboBox"
                        mc:Ignorable="d">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ccb:CheckedComboBox ItemsSource="{Binding Path=ComboSource}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ccb:CheckedComboBox ItemsSource="{Binding Path=ComboSource}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

這是背后的代碼...

DataGridCheckedComboColumn.xaml.cs

namespace DataTracker.Presentation.GridControls.Views
{
    /// <summary>
    /// Interaction logic for DataGridCheckedComboColumn.xaml
    /// </summary>
    public partial class DataGridCheckedComboColumn : DataGridTemplateColumn
    {
        public DataGridCheckedComboColumn()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Gets or sets the runway data.
        /// </summary>
        /// <value>The runway data.</value>
        public IEnumerable<Object> ComboSource
        {
            get
            {
                return (IEnumerable<Object>)this.GetValue(ComboSourceProperty);
            }
            set
            {
                this.SetValue(ComboSourceProperty, value);
            }
        }

        private static void OnComboSourceChanged(DependencyObject dependentView, DependencyPropertyChangedEventArgs e)
        {
            /////////////////////////////////////////////////////////////////
            //                                                             //
            // This is the code I used when I was making user controls and //
            // sending data to the view models                             //
            //                                                             //
            //                                                             //
            // Not sure what, if anything to do here now...                //
            //                                                             //
            /////////////////////////////////////////////////////////////////

            //var control = (DataGridComboColumn)dependentView;
            //var viewModel = (DataGridComboColumnViewModel)control.DataContext;

            //viewModel.ComboSource = (IEnumerable<Object>)e.NewValue;
        }

        public static readonly DependencyProperty ComboSourceProperty =
            DependencyProperty.Register("ComboSource",
                typeof(IEnumerable<Object>),
                typeof(DataGridCheckedComboColumn),
                new FrameworkPropertyMetadata()
                {
                    PropertyChangedCallback = OnComboSourceChanged,
                    BindsTwoWayByDefault = true
                });

    }
}

我像這樣將自定義控件添加到我的數據網格中...

<gc:DataGridCheckedComboColumn ComboSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl, AncestorLevel=1}, Path=DataContext.DataVersions}" />

一切都可以正確渲染,但是無論我傳遞什么數據,都無法實現。 我什至用硬編碼的清單發送了這些清單,但沒有運氣。 我也嘗試過發送其他簡單的屬性,例如字符串,但這也失敗了。

WPF給出以下錯誤。 我應該指出,“ GenericGridObject”是我用來填充整個數據網格的東西。

System.Windows.Data Error: 40 : BindingExpression path error: 'ComboSource' property not found on 'object' ''GenericGridObject`1' (HashCode=37030675)'. BindingExpression:Path=ComboSource; DataItem='GenericGridObject`1' (HashCode=37030675); target element is 'CheckedComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

就像我之前說過的那樣,我認為這是自定義控件的數據上下文存在的問題,但是我似乎無法弄清楚如何強制其使用自己的類作為數據上下文,而不是整個控件的數據上下文。網格。

有任何想法嗎?

我也遇到了類似的問題,即datacontext沒有繼承,我使用這里描述的代理技術解決了我的問題http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when -the-的datacontext-IS-未繼承/

更新:

嘗試在DataGridCheckedComboColumn中添加相對源

<ccb:CheckedComboBox ItemsSource="{Binding Path=ComboSource, RelativeSource={RelativeSource AncestorType=ccb:DataGridCheckedComboColumn}"

由於未在控件中指定任何Datacontext,因此我猜測它將采用其父級的Datacontext。 如果由於DataTemplates與DataGridTemplateColumn不在同一個邏輯樹或可視樹中而無法解決問題,請使用代理思想,這樣

<DataGridTemplateColumn x:Class="DataTracker.Presentation.GridControls.Views.DataGridCheckedComboColumn"
                        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:ccb="clr-namespace:CheckedComboBoxControl;assembly=CheckedComboBox"
                        mc:Ignorable="d">
            <DataGridTemplateColumn .Resources>
                <ccb:BindingProxy x:Key="proxy" Data="{Binding RelativeSource={RelativeSource AncestorType=ccb:DataGridCheckedComboColumn}}" />
            </DataGridTemplateColumn .Resources>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ccb:CheckedComboBox ItemsSource="{Binding Path=Data.ComboSource, Source={StaticResource proxy}}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ccb:CheckedComboBox ItemsSource="{Binding Path=Data.ComboSource, Source={StaticResource proxy}}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM