简体   繁体   English

[UWP] [C#]在列表框中的Web视图中显示绑定文本

[英][UWP][C#]Display binding text in webview in listbox

I have a webview in the listbox to display some options in the form of data bindings from the database (the number of options displayed according to the number of options in the database). 我在列表框中有一个Web视图,以数据库中数据绑定的形式显示一些选项(根据数据库中选项的数量显示选项的数量)。 I use webview because the answer option exists that contains the 我使用webview是因为答案选项存在,其中包含

tag. 标签。

Database: 数据库:

数据库

XAML: XAML:

<ListBox Name="ListOption" Grid.Row="4" xmlns:m="using:KipinATM_Win10.Tryout.Models" SelectionChanged="ListAlternatives_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate x:DataType="m1:DBOPTION">
                    <StackPanel Orientation="Horizontal">
                        <WebView Margin="4" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Code: 码:

int i = 0;
            while (alternative.Step() == SQLiteResult.ROW)
            {
                Items.Add(new DBOPTION(Convert.ToInt32(alternative[0]), alternative[1].ToString(), int.Parse(alternative[2].ToString()), Convert.ToInt32(alternative[3])));
                if (int.Parse(alternative[2].ToString()) == 1)
                {
                    thisquestioncorrectindex = i;
                }
                i++;
            }

            Binding myBinding = new Binding();
            myBinding.Source = Items;
            ListOption.SetBinding(ItemsControl.ItemsSourceProperty, myBinding);

DBOPTION.cs: DBOPTION.cs:

[SQLite.Net.Attributes.PrimaryKey]
        public int _id { get; set; }

        public string LABEL { get; set; }

        public int IS_CORRECT { get; set; }

        public int QUESTION_ID { get; set; }

        public DBOPTION()
        {
        }

        public DBOPTION(int ID, string Label, int IsCorrect, int QuestionID)
        {
            _id = ID;
            LABEL = Label;
            IS_CORRECT = IsCorrect;
            QUESTION_ID = QuestionID;
        }

I have trouble displaying the answer option on webview. 我无法在webview上显示答案选项。 How to display it in webview in listbox? 如何在列表框中的webview中显示它?

Note: Text displayed on the webview is a text in the LABEL column of the database 注意:Web视图上显示的文本是数据库的LABEL列中的文本

Firstly I don't think you need to use WebView control inside DateTemplate of ListBox , TextBlock or some other controls could just simply meet your requirements. 首先,我认为您不需要在ListBox DateTemplateTextBlock或其他一些控件中使用WebView控件就可以满足您的要求。 For "because the answer option exists that contains the tag" you mentioned, if you mean the scenario for the Tag property, which is to provide an general-purpose property on all FrameworkElement classes that supports data binding. 对于“因为存在包含标签的答案选项”,您的意思是说Tag属性的情况,该属性用于在所有支持数据绑定的FrameworkElement类上提供通用属性。

If you do want to binding text to WebView , you need to use attached properties since WebView doesn't have a property to bind to. 如果确实要将文本绑定到WebView ,则需要使用附加属性,因为WebView没有要绑定的属性。 Details for how to do please reference this article . 有关如何执行的详细信息,请参考本文

For example: 例如:

<ListBox Name="ListOption" Grid.Row="4" xmlns:m="using:KipinATM_Win10.Tryout.Models"   >
    <ListBox.ItemTemplate>
        <DataTemplate x:DataType="local:DBOPTION">
            <StackPanel Orientation="Horizontal">
                <WebView Margin="4" local:MyProperties.HtmlString="{Binding LABEL}" Height="300" Width="300" Tag="{Binding _id}"/>
                <TextBlock  Text="{Binding LABEL}" Tag="{Binding _id}"></TextBlock>
            </StackPanel> 
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Code behind: 后面的代码:

public sealed partial class MainPage : Page
{
    ObservableCollection<DBOPTION> Items;
    public MainPage()
    {
        this.InitializeComponent();
        Items = new ObservableCollection<DBOPTION>()
        {
            new DBOPTION()
            {
               _id=1,LABEL="test1",IS_CORRECT=1,QUESTION_ID=3
            },
             new DBOPTION()
            {
                _id=1,LABEL="test1",IS_CORRECT=1,QUESTION_ID=3
            },
              new DBOPTION()
            {
                 _id=1,LABEL="test1",IS_CORRECT=1,QUESTION_ID=3
            }
        };

        Binding myBinding = new Binding();
        myBinding.Source = Items;
        ListOption.SetBinding(ItemsControl.ItemsSourceProperty, myBinding);
    }

    private void ListAlternatives_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }
}

public class DBOPTION
{
    public int _id { get; set; }
    public string LABEL { get; set; }
    public int IS_CORRECT { get; set; }

    public int QUESTION_ID { get; set; }

 }
class MyProperties
{
    // "HtmlString" attached property for a WebView
    public static readonly DependencyProperty HtmlStringProperty =
       DependencyProperty.RegisterAttached("HtmlString", typeof(string), typeof(MyProperties), new PropertyMetadata("", OnHtmlStringChanged));

    // Getter and Setter
    public static string GetHtmlString(DependencyObject obj) { return (string)obj.GetValue(HtmlStringProperty); }
    public static void SetHtmlString(DependencyObject obj, string value) { obj.SetValue(HtmlStringProperty, value); }

    // Handler for property changes in the DataContext : set the WebView
    private static void OnHtmlStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        WebView wv = d as WebView;
        if (wv != null)
        {
            wv.NavigateToString((string)e.NewValue);
        }
    }
}

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

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