2

我正在创建一个 WPF 应用程序,我需要在页面顶部显示一个邮政地址。邮政地址下方是产品信息。产品信息从数据源返回并绑定到数据上下文。例如 this.DataContext = myComplexType;

工作人员需要手动切换显示哪个邮政地址。我认为最好的选择方法是通过单选按钮控件。换句话说,在我的页面上,我将有 3 个单选按钮,*UK Address *USA Address *China Address,根据选择的情况,将在顶部的 Textblock Name="txbPostalAddress" 中输入适当的文本页。

邮政地址位于一个名为 Addresses 的类中(作为字符串)。例如代码:

namespace DAL
{
    public class Addresses
    {
        public string GctHkAddress { get { return gctHkAddress;} }
        public string GctUsaAddress { get { return gctUsaAddress; } }
        public string GctUkAddress { get{return gctUkAddress;} }

        private string gctHkAddress = "Company Name\n Hong Kong \n";
        private string gctUsaAddress = "Company Name\n USA \n";
        private string gctUkAddress = "Company Name\n UK \n";
    }
}

我的问题是,绑定应该在 XAML 中还是在后面的代码中完成。我可以很容易地在后面的代码中做到这一点,但我觉得这否定了 XAML 的力量。有没有人知道哪种方法更好,如果通过 XAML,知道如何或链接到教程等?

谢谢

戴夫

4

3 回答 3

3

如果您的问题是在哪里设置 DataContext,它有时取决于,否则没关系。

通常 ViewModel(简而言之,一个具有数据和命令的类)设置为 DataContext。

可以通过以下方式完成

  1. 在 XAML -> 在 XAML 中为 ViewModel 创建静态资源,并使用 StaticResoure 进行设置。问题 -> View 必须了解 ViewModel,ViewModel 必须有无参数构造函数

  2. 在 ViewModel -> 将视图传递给 View Model 的构造函数,并在 ViewModel ctor 问题中设置 view.DataContext=this -> ViewModel 必须了解 View

  3. 附加在 View 和 ViewModel 之外,这通常在自定义引导类中完成(或通过覆盖 App-> OnStartUp。这里 View 是实例化的,ViewModel 是实例化的,View.DataContext 设置为 ViewModel 问题 -> 需要自定义初始化

  4. ViewModelLocator -> 在 XAML 中创建 ViewModelLocator 实例作为 StaticResource,将 DataContext 绑定到 ViewModelLocator Advantage 的属性 -> 视图,viewmodel 保持松散耦合。

于 2012-05-10T14:05:37.323 回答
0

如果您打算使用 MVVM,那么 XAML 是最好的选择,否则您也可以在代码中执行它

于 2012-05-10T14:04:56.703 回答
0

您可以使用任意数量的数据上下文,只要它位于不同的控件中即可。例如,您可以拥有一个负责格式化的 Address UserControl、一个 ViewModel 上的 Addresses 属性,它包含一个可用地址的列表,以及一个 CurrentAddress 属性,它将所选地址保存在 Addresses 列表之外。如果地址有几行,您可能希望将地址设为对象,而不仅仅是字符串。

您的 XAML 可能如下所示:

<Page>
    <!-- Page DataContext would be set in code behind. This would be the main ViewModel -->
    <my:AddressUserControl DataContext="{Binding CurrentAddress}"/>
    <ComboBox ItemsSource="{Binding Addresses}" SelectedItem="{Binding CurrentAddress}" DisplayMemberPath="CompanyName"/>
    <!-- more controls -->
</Page>
于 2012-05-10T18:05:43.923 回答