[英]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.