[英]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.