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

时间:2013-01-21 17:46:34

标签: c# xaml

我意外地提交了这个,我自己解决了这个问题并且在写出问题后不会提交。但是从评论中学到了,谢谢!

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

task.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个带有单选按钮的盒子,但没有文本(文本有空间)我不知道如何绑定bool?

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

<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>

你真的想要radiobuttons吗?我认为你想要Checkboxes,不同之处在于当你使用单选按钮时,只能在一组中有一个被“检查”

我使用此代码后面有一个datacontext:

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任务已经是框架中的一个类,可能会引起混淆。

答案 2 :(得分:0)

就像John已经提到的那样,你应该让包含listview的窗口实现INotifyPropertyChanged接口。并像Johan说的那样设置窗口的数据上下文。在属性的每个setter中调用propertychanged方法很重要。将ObservableCollection用作listview的ItemSource也很有用。尝试创建一个ObservableCollection的实例,为它创建一个属性,在其setter中调用propertychanged方法,将listview的一个set ItemSource设置为属性。每当您从集合中添加或删除项目时,不要忘记调用propertychanged