繁体   English   中英

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

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

我有一个绑定到网格组标题部分的DataTemplate。 DataTemplate中有四个TextBlock,其中一个TextBlock包含网格标题列值。 现在,我想将此TextBlock值拆分为三个,并从“隐藏代码”中将此值分配给其他三个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之上,我想访问TextBlock控件,即“ txtdescription ”,其中包含网格列'GlassDescription'的组标题部分的值,现在我想将此值分割为三个值,即txtdescription.Split('*')并分配值从后面的代码到DataTemplate中的其他三个文本块,即txtdesc1,txtdesc2,txtdesc3。

由于您需要样品,因此我在使用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中,可以使用“元素绑定”,该元素允许您访问给定元素的任何属性。 由于要访问txtdescription文本块的text属性,因此必须使用元素绑定。 但是您不会将其拆分为三个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> 

暂无
暂无

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

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