簡體   English   中英

從后面的代碼創建DataTemplate

[英]Creating DataTemplate from code behind

很抱歉這個不是那么普遍的問題...

我有一個ListView,我必須從后面的代碼中填充它,並且這個ListView還需要從后面的代碼中獲取它的GridViewColumn。

對於字符串,建立連接並不難,但是現在我不想在列表視圖中創建一個表示布爾值的橢圓。

XAML中的代碼相當簡單,但是我無法將其轉換為c#代碼。

這是XMAL代碼的一部分:

<ResourceDictionary>
    <BooleanToVisibilityConverter x:Key="BoolToVisibility" />
    <DataTemplate x:Key="templateAdmin">
        <DockPanel>
            <Ellipse Width="8" Height="8" Visibility="{Binding Path=isAdmin, Converter={StaticResource BoolToVisibility}}" Fill="Black"/>
        </DockPanel>
    </DataTemplate>
</ResourceDictionary>

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding LastName}" Header="Last Name"/>
            <GridViewColumn CellTemplate="{StaticResource templateAdmin}"
                <GridViewColumnHeader">
                    <TextBlock Text="S"/>
                </GridViewColumnHeader>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

到目前為止,我已經了解到了:XAML:

<local:SortableListView >
    <ListView.View>
        <GridView x:Name="GroupListGridView" />
    </ListView.View>
</local:SortableListView>

在代碼中,我有一個Collection<GridViewColumn> GridViewColumns ,我循環遍歷並將所有項目添加到GroupListGridView 我有一個函數來填充GridViewColumns集合:

private void CreateGridViews()
{
    //Creating the Text was easy!
    GridViewColumns.add(new GridViewColumn(){ Header = "LastName", DisplayMemberBinding = new Binding("LastName") });

    //Creating the Ellipse was harder!
    GridViewColumn gvc = new GridViewColumn();
    DataTemplate dt = new DataTemplate();

    gvc.DisplayMemberBinding = new Binding("isAdmin");
    FrameworkElementFactory fef = new FrameworkElementFactory(typeof(Ellipse));
    fef.SetValue(Ellipse.WidthProperty, 8.0D);
    fef.SetValue(Ellipse.HeightProperty, 8.0D);
    fef.SetValue(Ellipse.FillProperty, new System.Windows.Media.SolidColorBrush(System.Windows.Media.Colors.Black));

    //I'm guessing that somewhere here there should be some binding to the visibility property and some sort of conversion done... But I can't figure out how!

    dt.VisualTree = fef;
    gvc.CellTemplate = dt;
    GridViewColumns.Add(gvc);
}

我認為我沒有那么遠...只是我不知道這些最后的步驟!

缺少的行是:

var ellipseVisBinding = new Binding("isAdmin");
ellipseVisBinding.Converter = new BooleanToVisibilityConverter();

fef.SetBinding(Ellipse.VisibilityProperty, ellipseVisBinding);

(我注意到您已從代碼版本中排除了模板中的DockPanel,因此我也將其刪除了)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM