0

Grid Group Header Section にバインドされた DataTemplate があります。DataTemplate には、TextBlock の 1 つから 4 つの TextBlock があり、Grid Header Column Value が含まれています。ここで、この TextBlock 値を 3 つに分割し、この値をコード ビハインドの他の 3 つの TextBlock に割り当てます。出来ますか?

<DataTemplate x:Key="descriptionHeader">
            <!--<dxg:GroupGridRowContent>
                <TextBlock Background="Yellow" Text="{Binding DisplayText}" ></TextBlock>
            </dxg:GroupGridRowContent>-->

            <Border BorderBrush="Black"  BorderThickness="1" Width="1300">
                <StackPanel Orientation="Vertical" Margin="2">
                    <TextBlock Name="txtdescription" Text="{Binding DisplayText}" Width="200" HorizontalAlignment="Left" ></TextBlock>
                    <StackPanel Orientation="Horizontal" Margin="2" Height="80">

                        <Image Source=".\Images\description_img.png"  Stretch="None" FlowDirection="LeftToRight" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="1"/>
                        <StackPanel Orientation="Vertical" Margin="2">
                            <TextBlock Name="txtdesc1" Margin="2" FlowDirection="LeftToRight" Text="{Binding Path=GlassType,RelativeSource={RelativeSource Self}}"  TextWrapping="Wrap"  />
                            <TextBlock Name="txtdesc2" Margin="2" FlowDirection="LeftToRight" Text="{Binding Path=(dxg:RowData.RowData).GroupSummaryData[3].Text, RelativeSource={RelativeSource Self}}"  TextWrapping="Wrap"  />
                            <TextBlock Name="txtdesc3" Margin="2" FlowDirection="LeftToRight" Text="{Binding Path=(dxg:RowData.RowData).GroupSummaryData[4].Text, RelativeSource={RelativeSource Self}}"   TextWrapping="Wrap"  />
                        </StackPanel>
                    </StackPanel>
            </StackPanel>
            </Border>
        </DataTemplate>
    </Window.Resources>

  <dxg:GridControl Name="grdInfill"  Height="700" VerticalAlignment="Top" >
        <dxg:GridControl.Columns>
            <dxg:GridColumn FieldName="GlassType" AllowEditing="False"   />
            <dxg:GridColumn FieldName="GlassDescription" GroupValueTemplate="{StaticResource descriptionHeader}">
                <!--GroupValueTemplate="{StaticResource descriptionHeader}"-->
                <!--Header="GlassDescription" DisplayMemberBinding="{Binding Path=RowData.Row.GlassDescription, Mode=TwoWay}"-->
            </dxg:GridColumn>
            <dxg:GridColumn FieldName="GlassType" AllowEditing="False" />
            <dxg:GridColumn Name="qty" Header="Quantity" AllowEditing="False" DisplayMemberBinding="{Binding Path=RowData.Row.Quantity, Mode=TwoWay}" /> <!--FieldName="Quantity"-->
            <dxg:GridColumn FieldName="Width" AllowEditing="False" Header="Length"/>
            <dxg:GridColumn FieldName="Height" AllowEditing="False"/>
            <dxg:GridColumn FieldName="Elevation" AllowEditing="False"/>
            <dxg:GridColumn FieldName="Mark" AllowEditing="False"/>
            <dxg:GridColumn FieldName="GlassTag" AllowEditing="False"/>
            <dxg:GridColumn FieldName="WallLocation" AllowEditing="False"/>
            <dxg:GridColumn FieldName="SquareFoot" AllowEditing="False"/>
            <dxg:GridColumn FieldName="Weight" AllowEditing="False"/>
            <dxg:GridColumn FieldName="UnitCost" AllowEditing="False"/>
            <dxg:GridColumn FieldName="TotalCost" AllowEditing="False"/>
            <dxg:GridColumn FieldName="FuelSurcharge" AllowEditing="False"/>

        </dxg:GridControl.Columns>
        <dxg:GridControl.View>
            <dxg:TableView ShowTotalSummary="True" AutoWidth="True" DetailHeaderContent="True"  ShowIndicator="False" ShowGroupPanel="False"><!--GroupRowTemplate="{StaticResource descriptionHeader}"-->
            </dxg:TableView>
        </dxg:GridControl.View>
    </dxg:GridControl>




protected void GetAllInfills()
        {
            List<Infill> infillList = new List<Infill>();
            infillList=BLL.GetAllInfills();
            if (infillList != null)
            {
                grdInfill.ItemsSource = infillList;

                grdInfill.GroupBy(grdInfill.Columns["GlassType"], ColumnSortOrder.Ascending);
                grdInfill.GroupBy(grdInfill.Columns["GlassDescription"], ColumnSortOrder.Ascending);

                grdInfill.AutoExpandAllGroups = true;

            }
        }

上記の marukup からtxtdescription、グリッド列のグループ ヘッダー セクションの値を含む TextBlock コントロール、つまり ' 'にアクセスしたいのです'GlassDescription'が、この値 int を 3 つの値、つまり txtdescription.Split('*') に分割し、値を他の 3 つのテキストブロックに割り当てたいと考えています。つまり、コード ビハインドから DataTemplate にある txtdesc1、txtdesc2、txtdesc3 です。

4

1 に答える 1

1

サンプルをご要望いただきましたので、ListBoxを使ったサンプルをご提供いたします。XAML

<Window.Resources>
</Window.Resources>

<Grid>
    <ListBox x:Name="lstBox" ItemsSource="{Binding ListBoxItems}">
        <ListBox.ItemTemplate>
            <DataTemplate >
                <Border BorderBrush="Black"  BorderThickness="1" Width="1300" DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}">
                    <StackPanel Orientation="Vertical" Margin="2">
                        <TextBlock Name="txtdescription" Text="{Binding DisplayText, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" Width="200" HorizontalAlignment="Left" ></TextBlock>
                        <StackPanel Orientation="Horizontal" Margin="2" Height="80">

                            <StackPanel Orientation="Vertical" Margin="2">
                                <TextBlock Name="txtdesc1" Text="{Binding Path=TextBlock0}"/>
                                <TextBlock Name="txtdesc2" Text="{Binding Path=TextBlock1}"/>
                                <TextBlock Name="txtdesc3" Text="{Binding Path=TextBlock2}"/>
                            </StackPanel>
                        </StackPanel>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

コードビハインド

public partial class DataTemplateWindow : Window {
    public DataTemplateWindow() {

        DisplayText = "Some*Text*With*Separators";
        string [] splittedTextArray = DisplayText.Split('*');
        TextBlock0 = splittedTextArray[0];
        TextBlock1 = splittedTextArray[1];
        TextBlock2 = splittedTextArray[2];

        ListBoxItems = new List<string>();
        ListBoxItems.Add("Item 1");

        InitializeComponent();
        this.DataContext = this;
    }

    public string DisplayText { get; set; }

    public string TextBlock0 { get; set; }
    public string TextBlock1 { get; set; }
    public string TextBlock2 { get; set; }

    public List<string> ListBoxItems { get; set; }
}

追加情報に応じて編集

WPF では、特定の要素の任意のプロパティにアクセスできる Element Binding を使用できます。txtdescription textblock の text プロパティにアクセスしたいので、Element Binding を使用する必要があります。しかし、それを 3 つの TextBlock に分割したくはありません。そのためコンバーターが必要になります。

要素バインディングには以下のコードを使用してください

<StackPanel Orientation="Vertical" Margin="2">
    <TextBlock Name="txtdesc1" Text="{Binding ElementName=txtdescription, Path=Text, Converter={StaticResource splitter}, ConverterParameter=0 }"/>
    <TextBlock Name="txtdesc2" Text="{Binding ElementName=txtdescription, Path=Text, Converter={StaticResource splitter}, ConverterParameter=1 }"/>
    <TextBlock Name="txtdesc3" Text="{Binding ElementName=txtdescription, Path=Text, Converter={StaticResource splitter}, ConverterParameter=2 }"/>
</StackPanel>

そして、ここにコンバーターコードがあります

public class SplitterConverter : IValueConverter {

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        string combinedString = value as string;
        if (!string.IsNullOrEmpty(combinedString)) {
            string [] splitArray = combinedString.Split('*');
            int postion = int.Parse(parameter as string);
            switch (postion) {
                case 0:
                    return splitArray[0];
                case 1:
                    return splitArray[1];
                case 2:
                    return splitArray[2];
                default: 
                    return null;
            }
        }
        return null;
    }

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

最後に xaml に Converter 名前空間を含める

<Window x:Class="WpfApplication1.DataTemplateWindow"
    xmlns:cv="clr-yourconverterclassnamespace"
    ...
    >
<Window.Resources>
     <cv:SplitterConverter x:Key="splitter" />
</Window.Resources>
....
</Window>
于 2013-05-24T06:15:31.127 に答える