. FrameworkElement 등은 스타일링 만 지원합니다.
XAML에서 FrameworkElement
또는 FrameworkContentElement
이 아닌 형식의 스타일을 만들려고하면 해당 오류 메시지가 나타납니다.
어떻게 해결할 수 있습니까? 어떤 문제와 마찬가지로, 의지가있는 곳이 있습니다.
public class MyDataGridHelper : DependencyObject
{
// Use propa snipped to create attached TextColumnStyle with metadata:
... RegisterAttached("TextColumnStyle", typeof(Style), typeof(MyDataGridHelper), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
var grid = (DataGrid)obj;
if(e.OldValue==null && e.NewValue!=null)
grid.Columns.CollectionChanged += (obj2, e2) =>
{
UpdateColumnStyles(grid);
}
}
}
private void UpdateStyles(DataGrid grid)
{
var style = GetTextColumnStyle(grid);
foreach(var column in grid.Columns.OfType<DataGridTextColumn>())
foreach(var setter in style.Setters.OfType<Setter>())
if(setter.Value is BindingBase)
BindingOperations.SetBinding(column, setter.Property, setter.Value);
else
column.SetValue(setter.Property, setter.Value);
}
}
이 작동하는 방법은 다음과 같습니다
<DataGrid ...>
<local:MyDataGridHelper.TextColumnStyle>
<Style TargetType="FrameworkElement">
... setters here ...
</Style>
</local:MyDataGridHelper.TextColumnStyle>
...
이 구현은이 라인을 따라 뭔가 될 것이다 :이 경우에는 내가 가장 쉬운 솔루션은 데이터 그리드가되는 DataGridColumn 스타일을 지정하는 연결된 속성을 만드는 것입니다 생각 연결된 속성이 변경 될 때마다 표의 Columns.CollectionChanged 이벤트에 대한 처리기가 추가됩니다. CollectionChanged 이벤트가 발생하면 모든 열이 설정된 스타일로 업데이트됩니다.
위의 코드는 스타일이 제거되고 정상적으로 다시 추가되는 상황을 처리하지 않습니다. 두 개의 이벤트 처리기가 등록됩니다. 정말 견고한 솔루션의 경우 이벤트 처리기를 포함하는 다른 첨부 속성을 추가하여이 문제를 해결할 수 있으므로 이벤트 처리기를 등록 취소 할 수는 있지만 귀하의 목적에 따라 중요하지 않다고 생각합니다.
SetBinding 및 SetValue를 직접 사용하면 DefaultStyle
대신 BaseValueSource가 Local
인 DependencyProperty가 생성됩니다. 이것은 아마도 귀하의 경우에는 아무런 차이가 없지만 나는 그것을 언급해야한다고 생각했습니다.
Ray의 솔루션이 효과가 있습니까? 만약 그렇다면 나는 약간의 샘플 코드를보고 싶다. 여기서 얻지 못하는 부분은 해당 스타일의 TargetType이 FrameworkElement이므로 CanUserSort = False와 같은 속성을 어떻게 설정할 수 있습니까? 건배 – Berryl
여기에 또 다른 방법입니다 ... http://stackoverflow.com/questions/21982526/show-missing-part-of-text-in-datagrid-textbox-wpf –