0

背景:

我的视图中有一个 LabelService 类的实例,用于从不同语言获取文本。

这要求我在后台有如下代码来填充 TextBlock 中的文本:

XAML:

<TextBlock Name="txtExample" Grid.Row="0" Margin="5,5,5,5"/>

C#:

// 'this' refers to the current class, the namespace of which is used to navigate
// through an XML labels file to find the correct label
string label = _labelService.GetSpecificLabel(this, txtExample.Name).Label
txtExample.Text = label;

问题:

我是否有可能拥有此功能:

_labelService.GetSpecificLabel(this, txtExample.Name).Label

在 XAML 中可用?

补充资料:

只是为了解释我使用命名空间导航标签 XML 的意思:

假设类在命名空间中定义如下

namespace My.App.Frontend
{
    public class MainWindow
    {
        string label = _labelService.GetSpecificLabel(this, txtExample.Name).Label
    }
}

相应的 XML 将是

<My>
  <App>
    <Frontend>
      <MainWindow>
          <txtExample label="I am the example text" />
      </MainWindow>
    </Frontend>
  </App>
</My>
4

1 回答 1

1

在 WPF 中,通常使用 MVVM 模式来实现这一点。

在后面的代码中这样做甚至被认为是不好的做法,因为它不可测试且不易维护。尽可能将代码隐藏留空。

这样,您就有了一个可以连接到标签服务的 ViewModel 类。然后,您的视图将绑定到 ViewModel。

这是一个关于如何构建 WPF 应用程序的非常好的视频教程: Jason Dollinger on MVVM

他在教程中开发的源代码也可以在这里找到: Jason Dollinger 的源代码

这是一个非常简单的 ViewModel,只是为了让你有个起点:(注意 _labelService 和 txtExample 目前没有设置在那里)

public class TextBoxViewModel : INotifyPropertyChanged
{
    public TextBoxViewModel()
    {
        string label = _labelService.GetSpecificLabel(this, txtExample.Name).Label;
        this.text = label;
    }

    private string text;

    public string Text 
    { 
        get
        {
            return text;
        }

        set 
        {
            text = value;
            NotifyPropertyChanged("Text");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

在 XAML 中,Binding 部分很重要:

<TextBox Text="{Binding Text}" Height="26" HorizontalAlignment="Left" Margin="77,215,0,0" Name="textBox1" VerticalAlignment="Top" Width="306" />

在 Codebehind 中(或更好:你做脚手架的地方)

public MainWindow()
{
    InitializeComponent();

    this.DataContext = new TextBoxViewModel();
}
于 2012-07-31T14:25:49.587 回答