简体   繁体   English

从C#更新XAML控件模板

[英]Update a XAML control template from C#

I have a control template in XAML that contains a listview with a gridview. 我在XAML中有一个控件模板,其中包含带有gridview的listview。 I want to bind the listview to a datatable created within C# but I can't see the listview to do this because it is within a control template. 我想将列表视图绑定到在C#中创建的数据表,但是我看不到列表视图可以执行此操作,因为它在控件模板中。 I've created the equivalent listview in C# by referencing the control template and its contents and thought that I would be able to use this to set the binding but it hasn't worked. 我已经通过引用控件模板及其内容在C#中创建了等效的listview,并认为我可以使用它来设置绑定,但是它没有用。 Does any one have any suggestions? 有没有人有什么建议?

<ControlTemplate x:Key="HistoryView" TargetType="{x:Type ListViewItem}">

              <StackPanel x:Name="stkBonusHistory" Height="400" Visibility="Visible">

                <GridViewRowPresenter Content="{TemplateBinding Content}" Columns="{TemplateBinding GridView.ColumnCollection}"/>

                <!--this is the listview which I am hoping to turn into the "expander" detail-->
                    <ListView x:Name="lvBonusHistory" Width="950" Visibility="Visible" Height="300">
                      <ListView.View>
                        <GridView x:Name="gvBonusHistory" ColumnHeaderTemplate="{StaticResource GridViewHeader}" >
                        <GridViewColumn Header="Bonus Start" DisplayMemberBinding="{Binding BonusStart}" Width="150"/>
                        <GridViewColumn Header="Bonus End" DisplayMemberBinding="{Binding BonusEnd}" Width="150"/>
                        <GridViewColumn Header="Length" DisplayMemberBinding="{Binding Duration}" Width="75"/>
                        <GridViewColumn Header="Status" DisplayMemberBinding="{Binding BonusStatus}" Width="75"/>
                        <GridViewColumn Header="Note" DisplayMemberBinding="{Binding Note}" Width="75"/>
                      </GridView>
                    </ListView.View>
                  </ListView>
                </StackPanel>
            </ControlTemplate>

          <ListView x:Name="lvBonusList" Width="1000">
            <ListView.ItemContainerStyle>
              <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="Template" Value="{StaticResource Default}"/>
                <Style.Triggers>
                  <DataTrigger Binding="{Binding LeaversBonus}" Value="1">
                    <Setter Property="Template" Value="{StaticResource LeaversBonus}"/>
                  </DataTrigger>
                  <DataTrigger Binding="{Binding HistoryShow}" Value="1">
                    <Setter Property="Template" Value="{StaticResource Default}"/>
                    <Setter Property="Template" Value="{StaticResource HistoryView}"/>
                  </DataTrigger>
                </Style.Triggers>
              </Style>
            </ListView.ItemContainerStyle>

            <ListView.View>
              <GridView x:Name="gvBonusList" ColumnHeaderTemplate="{StaticResource GridViewHeader}" >
                <GridViewColumn x:Name="BonusHistory" Width="20" CellTemplate="{StaticResource BonusHistoryGraphic}" >
                </GridViewColumn>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding EmployeeName}" Width="250"/>
                <GridViewColumn Header="Emp ID" DisplayMemberBinding="{Binding EmpID}" Width="75"/>
                <GridViewColumn Header="Employee Start" DisplayMemberBinding="{Binding EmpStart}" Width="150" />
                <GridViewColumn Header="Employee End" DisplayMemberBinding="{Binding EmpEnd}" Width="150"/>
                <GridViewColumn Header="Bonus Start" DisplayMemberBinding="{Binding BonusStart}" Width="150"/>
                <GridViewColumn Header="Bonus End" DisplayMemberBinding="{Binding BonusEnd}" Width="150"/>
                <GridViewColumn Header="Length" DisplayMemberBinding="{Binding Duration}" Width="75"/>
              </GridView>
            </ListView.View>
          </ListView>

Codebehind 代码隐藏

private void PopulateBonusHistory()
{
        // populates dtBonusHistory
        BonusHistoryGet();
        ControlTemplate HistoryView = (ControlTemplate)stkBonusList.Resources["HistoryView"];
        StackPanel stkBonusHistory = (StackPanel)HistoryView.LoadContent();
        (stkBonusHistory.Children[1]).Visibility = Visibility.Collapsed;
        ListView lvBonusHistory = (ListView)stkBonusHistory.Children[1];
        lvBonusHistory.View = (GridView)(lvBonusHistory.FindName("gvBonusHistory"));

        Binding bind = new Binding();
        lvBonusHistory.DataContext = dtBonusHistory;
        lvBonusHistory.SetBinding(ListView.ItemsSourceProperty, bind);
    }

try using 尝试使用

lvBonusHistory.Source = dtBonusHistory;

as thats what you are trying to acheive anyway. 那就是您无论如何要达到的目标。

Create an attached property on the parent control then use TemplateBinding inside the ControlTemplate. 在父控件上创建一个附加属性,然后在ControlTemplate中使用TemplateBinding。 This way you can pass the source into ControlTemplate. 这样,您可以将源传递到ControlTemplate。

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

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