如何将对象传递给 WPF 用户控件

问题描述 投票:0回答:1

我想做的就是将一个对象(在本例中是“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...;
。我看不出有任何理由这应该像以前一样不可能。

c# wpf
1个回答
0
投票

我相信这比你想象的要简单。只需将

DataContext
类的实例提供给
Addon
即可。 XAML 表示绑定直接到
DataContext

此外,由于您不使用任何通知,因此最好将

InitializeComponent
移至构造函数中的最后。

public partial class AddonControl : UserControl
{
    public AddonControl(Addon content)
    {
        this.DataContext = content;
        InitializeComponent();
    }
    public Boolean AddonEnabled { get; set; }
}

我没有尝试,但应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.