【问题标题】:Access objects in code from XAML从 XAML 访问代码中的对象
【发布时间】:2014-05-14 11:50:00
【问题描述】:

我是 WPF 新手,正在尝试了解如何使用数据绑定将窗口上的控件绑定到后面代码中的对象。我看到了几个关于从代码隐藏中访问 XAML 对象的问题,但这不是我想要的。我已经知道该怎么做了。

label1.Content = LabelText;
listbox1.ItemsSource = ListItems;

我还看到了有关如何从 XAML 访问代码隐藏中的类的答案。

但我不知道如何将其应用于类的特定实例。这是我正在尝试做的一个例子。 “绑定”显然是不正确的。这就是我需要帮助的地方。

public partial class MainWindow : Window
{
    private string _labelText;
    private List<string> _listItems = new List<string>();

    public MainWindow()
    {
        InitializeComponent();

        _labelText = "Binding";
        _listItems.Add("To");
        _listItems.Add("An");
        _listItems.Add("Object");
    }

    public string LabelText
    {
        get { return _labelText; }
        set { _labelText = value; }
    }

    public List<string> ListItems
    {
        get { return _listItems; }
        set { _listItems = value; }
    }
}

<Window x:Class="SO_Demo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SO Demo" Height="160" Width="225">
  <Grid DataContext="MainWindow">
    <Label x:Name="label1" Width="80" Height="25" Margin="12,12,0,0" 
           Content="{Binding Path=LabelText}"
           HorizontalAlignment="Left" VerticalAlignment="Top" />
    <ListBox x:Name="listbox1" Width="100" Height="60" Margin="12,44,0,0" 
             ItemsSource="{Binding Path=ListItems}" DisplayMemberPath="ListItems"
             HorizontalAlignment="Left" VerticalAlignment="Top" />
  </Grid>
</Window>   

我读过的书籍和教程听起来应该很简单。我错过了什么?

【问题讨论】:

  • 请尝试改写问题,很难说你到底错过了什么。

标签: c# wpf xaml


【解决方案1】:

虽然您可以按照您尝试的方式直接将数据绑定到类,但这并不是通常的做法。推荐的方法是创建一个对象 (ViewModel) 来聚合您希望在 UI 中显示的所有模型数据,然后将该 ViewModel 设置为您的视图(在本例中为窗口)的 DataContext。我建议阅读 MVVM,这是大多数 WPF 应用程序的构建方式。但下面的示例可以帮助您入门。

这是一个基于您上面的示例的简单示例:

public class MyViewModel : INotifyPropertyChanged
{
    private string _title;
    private ObservableCollection<string> _items;

    public string LabelText
    { 
        get { return _title; } 
        set 
        { 
            _title = value;
            this.RaisePropertyChanged("Title");
        }
    }

    public ObservableCollection<string> ListItems { 
        get { return _items; }
        set 
        { 
            _items = value;   //Not the best way to populate your "items", but this is just for demonstration purposes.
            this.RaisePropertyChanged("ListItems");
        }
    }

    //Implementation of INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

代码隐藏

public partial class MainWindow : Window
{
    private MyViewModel _viewModel;

    public MainWindow()
    {
        InitializeComponent();
        _viewModel = new MyViewModel();

        //Initialize view model with data...

        this.DataContext = _viewModel;
    }
}

视图(窗口)

<Window x:Class="SO_Demo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SO Demo" Height="160" Width="225">
  <Grid>
    <Label x:Name="label1" Width="80" Height="25" Margin="12,12,0,0"               Content="{Binding Path=LabelText}"
           HorizontalAlignment="Left" VerticalAlignment="Top" />
    <ListBox x:Name="listbox1" Width="100" Height="60" Margin="12,44,0,0" 
             ItemsSource="{Binding Path=ListItems}"
             HorizontalAlignment="Left" VerticalAlignment="Top" />
  </Grid>
</Window>

【讨论】:

    【解决方案2】:

    您的问题是您说 Grid DataContext = MainWindow,您不需要这样做(数据上下文由孩子继承,除非他们为此提供自己的覆盖)并且您做错了(您'将上下文设置为 STRING MainWindow,而 STRING 没有“ListItems”或“LabelText”属性。

    如果你想使用当前类作为数据上下文,那么在 MainWindow 的构造函数中就可以了

    this.DataContext = this;

    并删除您在 XAML 中放置在网格上的数据上下文。

    【讨论】:

    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多