/ / बाइंडिंग डाटाग्रिड कॉलम डेटाटेम्पलेट अटैच प्रॉपर्टी में

बाइंडिंग डाटाग्रिड कॉलम डेटाटेम्पलेट अटैच प्रॉपर्टी में

मैं एक को अनुकूलित करने की कोशिश कर रहा हूँ DataGridColumnHeader के बजाय कई पाठ फ़ील्ड दिखाने के लिए
केवल हेडर पाठ द्वारा दिखाया गया है DataGridColumn.Header गुण.
अगर मुझे कुछ याद नहीं है, तो मुझे बस एक बनाना होगा DataTemplate और गुणों के लिए बाध्य करें
मूल वस्तु का। इस के लिए ठीक काम करता है DataGridColumn.Header संपत्ति लेकिन
संलग्न संपत्ति के लिए बाध्य करना विफल रहता है।

संपूर्णता के लिए, संलग्न संपत्ति का कार्यान्वयन:

public static class CustomHeader
{
public static string GetUnit(DependencyObject obj) { return (string)obj.GetValue(UnitProperty); }
public static void SetUnit(DependencyObject obj, string value) { obj.SetValue(UnitProperty, value); }

public static readonly DependencyProperty UnitProperty = DependencyProperty.RegisterAttached(
"Unit", typeof(string), typeof(CustomHeader), new FrameworkPropertyMetadata(null));
}

Xaml-Markup में उपयोग:

<DataGrid x:Name="tObjectDataGrid" Margin="10,50,10,10"
AutoGenerateColumns="False" EnableRowVirtualization="True"
ItemsSource="{Binding ObjectList}"
RowDetailsVisibilityMode="VisibleWhenSelected" >
<DataGrid.Resources>
<DataTemplate x:Key="CustomHeaderTemplate">
<StackPanel>
<TextBlock Text="{Binding}" />
<TextBlock Text="{Binding Path=(cust:CustomHeader.Unit)}" /> <-- attached binding doesn"t work :(
</StackPanel>
</DataTemplate>
</DataGrid.Resources>

<DataGrid.Columns>
<DataGridTextColumn x:Name="SpeedColumn"
Width="1*"
Binding="{Binding Speed}"
Header="Speed"
HeaderTemplate="{StaticResource CustomHeaderTemplate}"
cust:CustomHeader.Unit="[m/s]" />
</DataGrid.Columns>
</DataGrid>

मैं वास्तव में किसी भी टिप्पणी या वेबलिंक की सराहना करता हूं जो स्पष्ट करता है कि मैं यहां क्या याद कर रहा हूं। अग्रिम में धन्यवाद।

उत्तर:

जवाब के लिए 3 № 1

आपको मल्टी वैल्यू कन्वर्टर का उपयोग करना चाहिए (MSDN)।

XAML:

<DataGrid x:Name="tObjectDataGrid" Margin="10,50,10,10"
AutoGenerateColumns="False" EnableRowVirtualization="True"
ItemsSource="{Binding ObjectList}"
RowDetailsVisibilityMode="VisibleWhenSelected" >
<DataGrid.Resources>
<cust:UnitConverter x:Key="unitCon" />
<DataTemplate x:Key="CustomHeaderTemplate">
<StackPanel>
<TextBlock Text="{Binding}" />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource unitCon}">
<Binding Path="Columns" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGrid}" />
<Binding Path="." />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</DataTemplate>
</DataGrid.Resources>

<DataGrid.Columns>
<DataGridTextColumn x:Name="SpeedColumn"
Width="1*"
Binding="{Binding Speed}"
Header="Speed"
HeaderTemplate="{StaticResource CustomHeaderTemplate}"
cust:CustomHeader.Unit="[m/s]" />

<DataGridTextColumn x:Name="SpeedColumn2"
Width="1*"
Binding="{Binding Speed2}"
Header="Speed2"
HeaderTemplate="{StaticResource CustomHeaderTemplate}"
cust:CustomHeader.Unit="[km/h]" />
</DataGrid.Columns>
</DataGrid>

कोड के पीछे:

public class UnitConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string result = null;

ObservableCollection<DataGridColumn> columns = values[0] as ObservableCollection<DataGridColumn>;
string headerName = values[1].ToString();

var coll = columns.Where(x => x.Header.ToString() == headerName).FirstOrDefault();

if (coll != null)
result = CustomHeader.GetUnit(coll);

return result;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

मुझे लगता है कि बेहतर समाधान से नई कक्षा का निर्माण होगा HeaderData और उसके बाद आप xaml में इसका उदाहरण बना सकते हैं और इस वर्ग के लिए बाध्य कर सकते हैं।

उदाहरण:

हेडर डेटा रखने के लिए क्लास:

class HeaderData
{
public string Name { get; set; }
public string Unit { get; set; }
}

XAML कोड:

<DataGrid x:Name="tObjectDataGrid" Margin="10,50,10,10"
AutoGenerateColumns="False" EnableRowVirtualization="True"
ItemsSource="{Binding ObjectList}"
RowDetailsVisibilityMode="VisibleWhenSelected" >
<DataGrid.Resources>
<DataTemplate x:Key="CustomHeaderTemplate">
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Unit}" />
</StackPanel>
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn x:Name="SpeedColumn"
Width="1*"
Binding="{Binding Speed}"
HeaderTemplate="{StaticResource CustomHeaderTemplate}">
<DataGridTextColumn.Header>
<cust:HeaderData Name="Speed" Unit="[m/s]" />
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn x:Name="SpeedColumn2"
Width="1*"
Binding="{Binding Speed2}"
HeaderTemplate="{StaticResource CustomHeaderTemplate}">
<DataGridTextColumn.Header>
<cust:HeaderData Name="Speed2" Unit="[km/h]" />
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>

उत्तर № 2 के लिए 1

पहली नज़र में, आपका कोड सामान्य है, काम करना चाहिए। लेकिन जब आपकी निर्भरता संपत्ति के लिए निर्धारित है DataGridTextColumn, SetUnit नहीं बुलाया और चर Unit मूल्य NULL। मैंने इसमें संलग्न निर्भरता संपत्ति का मान निर्दिष्ट करने का प्रयास किया Window (चूंकि यह संलग्न है, आप इसके मूल्य को कहीं भी सेट कर सकते हैं) इस मामले में काम करना होगा:

<Window x:Class="DataGridAttachedHelp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataGridAttachedHelp"
local:CustomHeader.Unit="[m/s]"
Name="MyWindow"
Title="MainWindow" Height="350" Width="525"
WindowStartupLocation="CenterScreen">

<Grid>
<DataGrid x:Name="tObjectDataGrid" Margin="10,50,10,10"
AutoGenerateColumns="False" EnableRowVirtualization="True"
RowDetailsVisibilityMode="VisibleWhenSelected" >

<DataGrid.Resources>
<DataTemplate x:Key="CustomHeaderTemplate">
<StackPanel>
<TextBlock Text="{Binding}" />
<TextBlock Text="{Binding Path=(local:CustomHeader.Unit), ElementName=MyWindow}" />
</StackPanel>
</DataTemplate>
</DataGrid.Resources>

<DataGrid.Columns>
<DataGridTextColumn x:Name="SpeedColumn" Width="1*" Binding="{Binding Speed}" Header="Speed"
HeaderTemplate="{StaticResource CustomHeaderTemplate}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>

आपके मामले में संपत्ति काम नहीं करती थी, क्योंकि गुणों के स्रोत को इंगित करना आवश्यक है, उदाहरण के लिए: ElementName, Source। इसलिए, केवल नाम जोड़ें DataGridTextColumn पैरामीटर में ElementName:

<TextBlock Text="{Binding Path=(local:CustomHeader.Unit), ElementName=SpeedColumn}" />