Silverlight DataGridColumn AttachedProperties
-
06-07-2019 - |
문제
나는 만들려고 노력하고있다 AttachedProperty
a DataGridColumn
Silverlight 3.0 내에서 몇 가지 문제가 있습니다.
다음은 AttachedProperty입니다.
public class DataGridColumnHelper
{
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.RegisterAttached("Header", typeof(string), typeof(DataGridColumnHelper),
new PropertyMetadata(OnHeaderPropertyChanged));
private static void OnHeaderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
string header = GetHeader(d);
var dataGridColumn = d as DataGridColumn;
if (dataGridColumn == null)
{
return;
}
dataGridColumn.Header = GetHeader(dataGridColumn);
}
public static string GetHeader(DependencyObject obj)
{
return (string)obj.GetValue(HeaderProperty);
}
public static void SetHeader(DependencyObject obj, string value)
{
obj.SetValue(HeaderProperty, value);
}
}
보시다시피, 정말 간단합니다. DatagridColumn 클래스의 헤더 속성이 구속 될 수 없다는 제한을 극복하려고합니다.
이 xaml은 예상대로 작동합니다 ...
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="User Name"/>
그러나이 XAML은 오류를 던진다. )
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding Resources.UserNameListViewHeading, Source={StaticResource Labels}}"/>
실험을 위해서는이 속성 (위의 바인딩 구문 포함)을 DataGrid
그리고 확인했다 DataGridColumnHelper.Header
속성 OnHeaderPropertyChanged
방법과 값은 정확했습니다 (예외는 발생하지 않았습니다)
AttachedProperty가 첨부 된 대상은 DependencyProperty
. 반사판을 통해, DataGridColumn
(어떤에서 DataGridTextColumn
파생) 파생 DependencyProperty
.
누군가 이것에 대해 약간의 빛을 흘릴 수 있습니까? 응용 프로그램을 현지화하려고 노력하고 있으며 Datagrid에 문제가 있습니다. 나는 코드-비만에서 이것을 할 수 있다고 확신하지만, 그것을 피하려고 노력하고 있습니다.
해결책
Chris, 문제는 매우 간단합니다. DataGridTextColumn이 시각적 트리에서 "분리"되기 때문에 작동하지 않습니다. DataGridTextColumn 객체는 Datagrid의 열에 루팅되어 있습니다. 간접 참조. 따라서 첨부 된 속성조차도 예상대로 작동하지 않습니다. 이제 첨부 된 바인딩이라고 부르는 것을 사용 하여이 모든 작업을 수행 할 수있는 방법이 있습니다.
http://www.ordtane.com/blog/post/2009/09/29/introoping-nroutetoolkit-for-silverlight-(part-i).aspx
VisualTree에있는 것을 사용하여 바인딩 속성을 첨부하는 것을 잊지 마십시오 (열을 고정하는 그리드는 괜찮습니다.)
도움이 되었기를 바랍니다.
다른 팁
이것을 사용해보십시오. 사용자 이름이 뷰 모델의 속성이라고 가정합니다.
<Controls:DataGridTextColumn Binding="{Binding OwnerName}"
HeaderStyle="{StaticResource DataGridColumnHeaderStyle}"
Behaviors:DataGridColumnHelper.Header="{Binding UserName}"/>
시나리오를 테스트 할 수 없으므로 내 게시물은 아이디어 일뿐입니다. 작동하지 않을 수도 있습니다.