gpt4 book ai didi

c# - 如何从 XAML 访问代码中的对象

转载 作者:行者123 更新时间:2023-11-30 20:03:21 25 4
gpt4 key购买 nike

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

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

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

<local:MyClass x:Key="myClass" />

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

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>

我看过的书籍和教程都说这应该很简单。我错过了什么?

最佳答案

虽然您可以按照您尝试的方式将 DataBind 直接连接到类,但这并不是通常的做法。推荐的方法是创建一个对象 (ViewModel),它聚合了您想要在 UI 中显示的所有模型数据,然后将该 ViewModel 设置为您的 View (在本例中为 Window)的 DataContext。我建议阅读有关 MVVM 的内容,这是大多数 WPF 应用程序的构建方式。但下面的示例可以帮助您入门。

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

View 模型

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

View (窗口)

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

关于c# - 如何从 XAML 访问代码中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15211829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com