简体   繁体   English

如何找到DataTemplate内部的控件并在WPF中分配值?

[英]How to Find a Control that is inside DataTemplate & assign Value in WPF?

I have a DataTemplate which is binded to Grid Group Header Section. 我有一个绑定到网格组标题部分的DataTemplate。 There are four TextBlock in DataTemplate from one of TextBlock contains the Grid Header Column Value. DataTemplate中有四个TextBlock,其中一个TextBlock包含网格标题列值。 Now, I want to Split this TextBlock Value into three and assign this value to other three TextBlock from Code Behind. 现在,我想将此TextBlock值拆分为三个,并从“隐藏代码”中将此值分配给其他三个TextBlock。 Is it Possible? 可能吗?

<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;

            }
        }

From Above marukup i want to access the TextBlock Control ie ' txtdescription ' which contains the group header section value of Grid Column 'GlassDescription' now i want to split this value int to three value ie txtdescription.Split('*') and assign values to other three textblock ie txtdesc1,txtdesc2,txtdesc3 that are in DataTemplate from code behind. 从marukup之上,我想访问TextBlock控件,即“ txtdescription ”,其中包含网格列'GlassDescription'的组标题部分的值,现在我想将此值分割为三个值,即txtdescription.Split('*')并分配值从后面的代码到DataTemplate中的其他三个文本块,即txtdesc1,txtdesc2,txtdesc3。

Since you requested a sample, I am providing a sample using ListBox. 由于您需要样品,因此我在使用ListBox提供样品。
XAML 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>
 
  

CodeBehind 代码背后

 
 
 
  
  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; } }
 
  

EDIT in response to additional information 编辑以响应其他信息

In WPF you can use Element Binding which allows you to access any property of a given element. 在WPF中,可以使用“元素绑定”,该元素允许您访问给定元素的任何属性。 Since you want to access txtdescription textblock's text property, you will have to use the Element Binding. 由于要访问txtdescription文本块的text属性,因此必须使用元素绑定。 But you wan't to split that into three TextBlocks. 但是您不会将其拆分为三个TextBlock。 So you will need a converter. 因此,您将需要一个转换器。

Use the code below for element binding 使用以下代码进行元素绑定

 <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> 

And here is the converter code 这是转换器代码

 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(); } } 

Finally Include Converter Namespace in xaml 最后在xaml中包含Converter命名空间

 <Window x:Class="WpfApplication1.DataTemplateWindow" xmlns:cv="clr-yourconverterclassnamespace" ... > <Window.Resources> <cv:SplitterConverter x:Key="splitter" /> </Window.Resources> .... </Window> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM