我想做的就是将一个对象(在本例中是“Addon”的实例)传递到 UserControl(在本例中是“AddonControl”)并可以作为 UserControl 的成员访问它。 该对象在 UserControl 的生命周期内永远不会改变,我不需要任何花哨的东西,我只需要访问该对象,以便可以显示其属性。
我尝试了大约 15 种不同的方法来尝试引用我想要控制访问的(静态)对象,但没有一种方法有效。我尝试了 DependencyProperty,但没有执行任何操作。我已经在这个网站上搜索了大约一个小时,所有的答案都是可笑的、臃肿的废话,甚至不适用。 我希望有一个简单、合理的方法将静态对象绑定到控件的实例,以便我可以访问该对象的公共属性,就像所有面向对象编程中的正常情况一样。
以下是相关文件的代码:
插件.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;
//Currently a shell class, will be filled later.
namespace Magian_Launcher.lib.data
{
public class Addon
{
public static Addon example = new Addon("Example Addon", "This is an example addon for testing the UI", "test.example.com", "", "test.example.com");
public string Name { get; set; }
public string Author { get; set; }
public string Description { get; set; }
public string DownloadURL { get; set; }
public string InstallLocation { get; set; }
public string RepoURL { get; set; }
public Addon() { }
public Addon(string name, string description, string downloadURL, string installLocation, string repoURL)
{
Name = name;
Description = description;
DownloadURL = downloadURL;
InstallLocation = installLocation;
RepoURL = repoURL;
}
public void Install()
{
}
public void Uninstall()
{
}
public void Update()
{
}
public override string ToString()
{
return $"{Name}\n{Description}\n{DownloadURL}\n{InstallLocation}";
}
}
}
AddonControl.xaml
<UserControl x:Class="Magian_Launcher.AddonControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Magian_Launcher"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="3*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="4*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Title}" />
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Author}"/>
<TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding Description}"/>
</Grid>
</UserControl>
AddonControl.xaml.cs
using Magian_Launcher.lib.data;
using MahApps.Metro.ValueBoxes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Magian_Launcher
{
/// <summary>
/// Interaction logic for AddonControl.xaml
/// </summary>
public partial class AddonControl : UserControl
{
public AddonControl(Addon content)
{
InitializeComponent();
this.content = content;
this.DataContext = this;
}
public Addon content { get; set; }
public string Title { get { return content.Name; } }
public string Description { get { return content.Description; } }
public string Author { get { return content.Author; } }
public string RepoURL { get { return content.RepoURL; } }
public Boolean AddonEnabled { get; set; }
}
}
目标是在任何其他文件中使用 AddonControl 显示
public static Addon example...;
。我看不出有任何理由这应该像以前一样不可能。
我相信这比你想象的要简单。只需将
DataContext
类的实例提供给 Addon
即可。 XAML 表示绑定直接到 DataContext
。
此外,由于您不使用任何通知,因此最好将
InitializeComponent
移至构造函数中的最后。
public partial class AddonControl : UserControl
{
public AddonControl(Addon content)
{
this.DataContext = content;
InitializeComponent();
}
public Boolean AddonEnabled { get; set; }
}
我没有尝试,但应该可以。