如何在xaml uwp中直接绑定属性

时间:2017-10-06 15:03:15

标签: c# xaml uwp

 public sealed partial class MainPage : Page
    {
        //public static dynamic resource;

        public  ResourceModel vm = new ResourceModel();        

        public MainPage()
        {
            this.InitializeComponent();              
        }
     }


public class ResourceModel 
    {
        private Dictionary<string, string> _resource;
        public Dictionary<string, string> Resource
        {
            get { return _resource; }
            set
            {
               _resource=Value;
            }
        }
    }

Xaml代码

<TextBlock Text="{Binding vm.Resource[Account] ,Mode=TwoWay}" FontSize="15" Margin="10 0 30 0" Foreground="White" VerticalAlignment="Top" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="0"></TextBlock>

描述  我想从没有DataContext和Textblock的Name的ResourceModel绑定我的textblock。只有我需要使用属性Name绑定。

1 个答案:

答案 0 :(得分:0)

有几个地方你错过了。以下是关于em的一些信息:

  1. Binding正在搜索不可用的数据上下文。如果您没有viewmodel,并且想要使用旧版binding将UI元素绑定到后面的代码,则需要在DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"代码中添加<Page> xaml。这将告诉绑定引擎您绑定到后面的代码。
  2. 此外,您无法绑定到字段,只能绑定到properties,因为字段没有getset。因此,在您的代码后面vm是一个字段,而不是一个属性。将其更改为public ResourceModel vm { get; set; } = new ResourceModel();,它将开始工作。
  3. 话虽如此,有三种方法可以解决这个问题:

    1。使用binding代码隐藏:

    <page>标记中添加DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"以告知绑定引擎您将绑定到后面的代码。

    您的textblock代码如下所示:

    <TextBlock Text="{Binding vm.Resource[Account]}"/>
    

    我不明白为什么Mode设置为two way,因为它是Textblock且不可编辑,遗留binding默认为oneWay }。

    2。将bindingResourceModel

    一起使用

    另一种方法是将textblock的数据上下文设置为直接绑定到Model。下面是代码:

     <TextBlock Text="{Binding Resource[Account]}">
           <TextBlock.DataContext>
                <local:ResourceModel/>
           </TextBlock.DataContext>
      </TextBlock>
    

    3。使用x:bind作为绑定背后的代码

    默认情况下x:bind绑定到后面的代码,因此您可以使用x:bind而不是绑定。您使用x:bind时遇到的问题是因为在使用x:bind时无法在xaml中设置密钥。使用转换器,然后传入您的密钥作为转换器参数,它们都将开始工作正常。如果你打算在下面使用它,那就是xaml代码:

    <TextBlock Text="{x:Bind vm.Resource,Converter={StaticResource DictionaryValueFetcher},ConverterParameter='account'}"/>