通过XAML或代码绑定

时间:2012-05-10 13:54:41

标签: c# wpf xaml binding code-behind

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

员工需要手动切换要显示的邮政地址。我认为最好的方法是通过单选按钮控制来选择。换句话说,在我的页面上,我将有3个单选按钮,*英国地址*美国地址*中国地址,根据选择的内容,相应的文本将输入到文本块顶部的文本块名称=“txbPostalAddress”中。页。

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

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,任何想法如何或链接到教程等?

由于

戴夫

3 个答案:

答案 0 :(得分:3)

如果你的问题是在哪里设置DataContext,它只是有时依赖,否则无关紧要。

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

可以通过以下方式完成

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

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

  3. Attach outside View and ViewModel,这通常在自定义引导类中完成(或通过覆盖App-> OnStartUp。这里View是instanciated,ViewModel是instanciated,View.DataContext设置为ViewModel 问题 - >需要自定义初始化

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

答案 1 :(得分:0)

如果你计划使用MVVM,那么XAML是最好的选择,你可以在后面的代码中做到这一点

答案 2 :(得分:0)

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

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