将具有布尔值和文本的类数据绑定到 XMAL

本文关键字:数据绑定 XMAL 文本 布尔值 | 更新日期: 2023-09-27 17:55:17

我不小心提交了这个,我自己修复了它,写出问题后不会提交。但是从评论中学到了,谢谢!

我正在尝试在win8中创建一个简单的待办事项应用程序,并最终希望将其放入ToDoIst API。我创建了一个简单的任务类来尝试绕过数据绑定,但我就是无法让它做我想做的事情。我使用了列表框和其他基本表单元素。

任务.cs

class task
{
    private string content;
    private bool complete;
    public string Content
    {
        get {return content;}
        set { content = value; }
    }
    public bool Complete
    {
        get { return complete; }
        set { complete = value; }
    }
    public task(string content)
    {
        Content = content;
        Complete = false;
    }
}

MainPage.xaml

目前,我的 XAML 看起来像这样。

<GridView HorizontalAlignment="Left" Margin="482,190,0,0" VerticalAlignment="Top" Width="400" Height="500">
        <ListView x:Name="LVtasks" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="400" ItemsSource="{Binding}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Content}"/>
                        <RadioButton/>
                    </StackPanel>   
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </GridView>

我已经输入了一些虚拟数据,4 个元素,当我运行它时,它会出现 4 个带有单选按钮的框,但没有文本(文本有空间)我不确定我将如何绑定布尔值?

看不出我做错了什么。如果有人可以帮助并指出我正确的方向,我已经搜索了相当多的教程,只是无法弄清楚。

将具有布尔值和文本的类数据绑定到 XMAL

你的代码看起来有点奇怪,也许这就是你想要的:

<ListView x:Name="LVtasks" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="400" ItemsSource="{Binding ToDoItems}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <RadioButton GroupName="ToDos" Content="{Binding Content}" IsChecked="{Binding IsComplete}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

你真的想要单选按钮吗?我认为您想要复选框,不同之处在于当您使用单选按钮时,组中只能"选中"一个按钮

我使用下面的代码来获得数据上下文:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
            ToDoItems = new ObservableCollection<TodoItem>(new List<TodoItem>
                {
                    new TodoItem("Content1"),
                    new TodoItem("Content2")
                });
        this.DataContext = this;
    }
    public ObservableCollection<TodoItem> ToDoItems { get; set; }
}

我将任务的名称更改为 ToDoItem 任务已经是框架中的一个类,可能会引起混淆。

对于RadioButton IsChecked是绑定到 bool 属性的属性:

<RadioButton IsChecked="{Binding Path=Complete}"/>

您的文本很可能没有显示,因为您尚未设置任何更改通知,并且在设置Content值之前发生了绑定。使用 INotifyPropertyChanged 接口是最常见且通常最简单的方法。

就像 John 已经提到的,你应该让包含列表视图的窗口实现 INotifyPropertyChanged 接口。并像 Johan 所说的那样设置窗口的数据上下文。在属性的每个资源库中调用 propertychanged 方法非常重要。将可观察集合用作列表视图的项源也很有用。尝试创建 ObservableCollection 的实例,为其创建一个属性,在其资源库中调用 propertychanged 方法,将列表视图的集合 rhe ItemSource 设置为该属性。不要忘记在集合中添加或删除项时调用属性更改