0

リストボックスのデータ ソース (正確には XmlDataProvider と DataTemplate) をプログラムで設定するユーザー コントロールがありますが、実行時に正しく表示されません。ユーザー コントロールが読み込まれるとき。データプロバイダーのすべての設定が反映されていません。

これを手伝ってくれませんか?私はWPFアプリケーションの開発に本当に慣れていません。

ティア

コードは次のとおりです。

XAML

<UserControl x:Class="ENGAGIAUCL.Views.ImageViewer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="500" Width="550">
    <UserControl.Resources>
        <XmlDataProvider x:Key="FormDataProvider"/>
        <DataTemplate x:Key="FormTemplate">
            <Border Background="#2200FF00"
                    BorderBrush="Black" 
                    BorderThickness="1"
                    CornerRadius="8"  
                    Margin="2,4,2,4" 
                    Padding="4">
                <StackPanel HorizontalAlignment="Stretch">
                    <TextBlock Text="{Binding XPath=name}" />
                </StackPanel>
            </Border>
        </DataTemplate>
    </UserControl.Resources>
    <DockPanel>
        <Border DockPanel.Dock="Top"
                Height="45">
            <TextBlock x:Name="tbkContentTitle"
                       Text="Content Title Goes Here" 
                       VerticalAlignment="Center" 
                       HorizontalAlignment="Center"
                       FontSize="20">
            </TextBlock>
        </Border>
        <DockPanel>
            <Border DockPanel.Dock="Bottom">
            </Border>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <ListBox x:Name="lbPreview" 
                     IsSynchronizedWithCurrentItem="True"
                     VerticalAlignment="Top" 
                     Height="455" 
                     Grid.Column="0"
                     ItemsSource="{Binding}">
                </ListBox>
                <Frame x:Name="ActualContentFrame" 
                                           Grid.Column="1"
                       Source="{Binding XPath=url}">
                </Frame>
            </Grid>
        </DockPanel>
    </DockPanel>
</UserControl>

そして、ここに.csファイルがあります

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

using EngagiaCL.CommonObjects;
using EngagiaCL.Functions;

namespace ENGAGIAUCL.Views
{
    /// <summary>
    /// Interaction logic for ImageViewer.xaml
    /// </summary>
    public partial class ImageViewer : UserControl
    {
        public ImageViewer()
        {
            InitializeComponent();
            Loaded += (s, e) =>
                {
                    LoadContents();
                };
        }

        #region Methods
        private void LoadContents()
        {
            if (CurrentUser != null)
            {
                XmlDataProvider provider = (XmlDataProvider)this.FindResource("FormDataProvider");
                DataTemplate template = (DataTemplate)this.FindResource("FormTemplate");
                Binding templatebinding = new Binding();

                provider.Document = CurrentUser.UserDoc;
                provider.XPath = GetResourcePath();

                template.DataType = (object)GetDataTemplateObject();
                Resources["FormDataProvider"] = provider;
                Resources["FormTemplate"] = template;
            }
        }
        private string GetResourcePath()
        {
            string path = string.Empty;

            if (ContentType == "ADMIN")
            {
                path = "/SyncLoginResponse/AdminForms/AdminForm";
            }
            else
            {
                path = "/SyncLoginResponse/Forms/Form";
            }

            return path;
        }
        private string GetDataTemplateObject()
        {
            string templateobject = string.Empty;

            if (ContentType == "ADMIN")
            {
                templateobject = "AdminForm";
            }
            else
            {
                templateobject = "Form";
            }

            return templateobject;
        }
        #endregion

        #region Properties
        public UserInformation CurrentUser { get; set; }
        public string ContentType { get; set; }
        #endregion
    }
}

参照用のxmlは次のとおりです。

</SyncLoginResponse>
    <AdminForms>
        <AdminForm>
            <name>Best Form Ever/html</name>
            <url>
                http://blahblahblah/
            </url>
        </AdminForm>
    </AdminForms>
</SyncLoginResponse>

注意事項:

  1. CurrentUser は、UserDoc プロパティ内に xml ドキュメントを含むオブジェクトです。
  2. 私がこのアプリケーションで行ったことのほとんどは、私がグーグルで理解したことのほんの一部です。
4

1 に答える 1

0

正直なところ、あなたがWPF UIをロードするための新しいコーディング手法であるかどうかはわかりませんが、ミスのように見えるものはほとんどありません...

  1. あなたListBox.ItemsSourceはビュー全体{Binding}のにバインドされているようにバインドされDataContextていますが、コードビハインドのどこにもDataContext、リストボックスのビューまたはより高いレベルの親を設定していません。

  2. templateBindingコードビハインドからの変数は、作成後はどこにも使用されません。

  3. メソッドの最後にFormDataProvider設定するのはなぜですか?辞書を「更新」したい場合、それは正しい方法ではありません。FormTemplateLoadContentsResources

更新するResourcesには、辞書のリソースを削除および追加するResourcesと同時に、DynamicResourceマークアップ参照を使用する必要があります。

あなたが正確に達成したいことは何ですか。

于 2011-09-12T06:23:51.770 に答える