标签: data-binding

为什么DataContext和ItemsSource不是多余的?

在WPF数据绑定中,我知道你有DataContext一个告诉元素它将绑定到哪个数据以及ItemsSource哪个"绑定".

但是,例如在这个简单的例子中,它似乎没有ItemsSource做任何有用的事情,因为,除了绑定之外,你还想要Element做什么DataContext呢?

<ListBox DataContext="{StaticResource customers}" 
         ItemsSource="{Binding}">
Run Code Online (Sandbox Code Playgroud)

在更复杂的例子中ItemsSource,你有路径和来源似乎正在侵占其领土DataContext.

ItemsSource="{Binding Path=TheImages, Source={StaticResource ImageFactoryDS}}"
Run Code Online (Sandbox Code Playgroud)

了解这两个概念的最佳方法是什么,以了解何时以及如何在各种编码方案中应用它们?

data-binding wpf datacontext itemssource

34
推荐指数
2
解决办法
2万
查看次数

如何对ColumnDefinition的Width或RowDefinition的高度进行数据绑定?

在WPF的View-Model-ViewModel模式下,我试图为网格控件的各种定义的高度和宽度进行数据绑定,因此我可以在使用GridSplitter后存储用户设置它们的值.但是,正常模式似乎不适用于这些特定属性.

注意:我发布这个作为参考问题,我发布谷歌失败了我,我不得不自己解决这个问题.我自己的答案可以遵循.

data-binding wpf grid column-width row-height

33
推荐指数
3
解决办法
3万
查看次数

PropertyChanged用于索引器属性

我有一个带有索引器属性的类,带有一个字符串键:

public class IndexerProvider {
    public object this[string key] {
        get
        {
            return ...
        }
        set
        {
            ...
        }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

我使用索引符号绑定到WPF中此类的实例:

<TextBox Text="{Binding [IndexerKeyThingy]}">
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想PropertyChanged在其中一个索引器值更改时引发事件.我尝试使用属性名称"[keyname]"(即在键的名称周围包括[])来提升它,但这似乎不起作用.我的输出窗口中没有任何绑定错误.

我不能使用CollectionChangedEvent,因为索引不是基于整数的.从技术上讲,该对象无论如何都不是一个集合.

我可以这样做,等等,怎么样?

c# data-binding wpf indexer

33
推荐指数
4
解决办法
1万
查看次数

如何告诉我的DataTemplate绑定到PARENT ViewModel中的属性?

我有以下MainView.xaml文件,它可以很好地用作MVVM菜单切换器.我有这些配对:

  • Page1View/Page1ViewModel
  • Page2View/Page2ViewModel

在我的MainViewModel中,我用两个ViewModel填充ObservableCollection,然后当用户单击Next按钮时,它调用MainViewModel中的NextPageCommand,它将一个新的ViewModel 切换出CurrentPageViewModel,然后用适当的View显示,效果很好.

我还有一个菜单填充了Observable集合中ViewModels的所有标题,这也很好用.

但是,每个MenuItem都有一个Command ="{Binding SwitchPageCommand}",它应该在MainViewModel上调用SwitchPageCommand,而不是在例如Page1ViewModelPage2ViewModel上调用.

那么我怎么能在模板中指出不要绑定到当前的ViewModel,而是包含 ViewModel的ViewModel,例如:

PSEUDO-CODE:

<DataTemplate x:Key="CodeGenerationMenuTemplate">
    <MenuItem 
        Command="{Binding <parentViewModel>.SwitchPageCommand}" 
        Header="{Binding Title}" 
        CommandParameter="{Binding Title}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

这是MainViewModel:

<Window x:Class="TestMenu234.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:c="clr-namespace:TestMenu234.Commands"
    xmlns:vm="clr-namespace:TestMenu234.ViewModels"
    xmlns:v="clr-namespace:TestMenu234.Views"
    Title="Main Window" Height="400" Width="800">

    <Window.Resources>
        <DataTemplate x:Key="CodeGenerationMenuTemplate">
            <MenuItem Header="{Binding Title}" Command="{Binding SwitchPageCommand}" CommandParameter="{Binding Title}"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:Page1ViewModel}">
            <v:Page1View/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:Page2ViewModel}">
            <v:Page2View/>
        </DataTemplate>
    </Window.Resources>

    <DockPanel>

        <Menu DockPanel.Dock="Top">
            <MenuItem Header="Code …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf xaml mvvm

33
推荐指数
1
解决办法
3万
查看次数

如何布尔&&两个可见性转换器

我有两个独立的可见性转换器,一个基于字段是否已更新,另一个基于是否允许查看字段.我对我页面上的每个文本项使用updatedField,以便在更新的字段旁边显示一个星号.但是某些用户只能根据权限级别看到某些文本项.

例如:

<Image Visibility="{Binding ElementName=MyObject, Path=UpdatedFields, Mode=OneWay, Converter={StaticResource updatedFieldConverter}, ConverterParameter=FieldToTest}" Source="Properties:Resources.star_yellow" />
Run Code Online (Sandbox Code Playgroud)

<TextBlock FontSize="21" Foreground="{DynamicResource LabelBrush}" Text="{x:Static Properties:Resources.Some_Text}" Visibility="{Binding Source={StaticResource allowedFields}, Path=Some_Text_Field, Converter={StaticResource visibilityConverter}}" />
Run Code Online (Sandbox Code Playgroud)

我的问题是,对于需要许可的字段,我需要运行两个转换器来确定星是否出现.有没有办法在两个转换器的结果上做一个布尔"And"?

我查看了这篇文章,但它似乎不允许将不同的参数集传递给两个不同的转换器.

------- --------更新

我还试图用这个xaml创建一个MultiValueConverter

<Image Grid.Row="4" Grid.Column="0" Source="star_yellow.png">
   <Image.Visibility>
      <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest" >
         <Binding ElementName="allowedFieldsModel" Path="Some_Text_Field" Mode="OneWay" />                        
         <Binding ElementName="MyObject" Path="UpdatedFields" Mode="OneWay" />
      </MultiBinding>
   </Image.Visibility>
</Image>
Run Code Online (Sandbox Code Playgroud)

但是当它进入转换器时,两个值都是"DependencyProperty.UnsetValue".所以我显然在这里做错了.

- - - - 解 - - - - -

我不得不修改它,但后来它工作了.

<Image.Visibility>
    <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest">
        <Binding Source="{StaticResource allowedFieldsModel}" Path="Some_Text_Field" />
        <Binding Path="MyObject.UpdatedFields" …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf converter

33
推荐指数
2
解决办法
4万
查看次数

什么是DataContext?

作为将DataContext与WPF中的另一个属性链接的问题的延续.

在研究的最后,我非常惊讶地发现当一个人写这样的东西时:

<Label Content="{Binding Path=Name}" />
Run Code Online (Sandbox Code Playgroud)

DataContext其对Content性能的绑定是的Label控制本身!它仍然有效的事实是由于最近父级的DataContext值的默认继承.

但是,如果您将此标签包装在自定义控件中,并且您不希望将数据绑定到该DataContext控件的属性,那么您可能更喜欢:

<Controls:SearchSettings Settings="{Binding Path=Settings}" />
Run Code Online (Sandbox Code Playgroud)

你在这里.现在,你需要设置SettingsDataContextSearchSettings控制,对Label内部绑定反对,但你不能,因为这会触发重新绑定的Settings属性.

我看不到在使用不同来源的混合绑定属性点:DataContext通过ElementName等,那么,为什么我会永远使用DataContext

data-binding wpf

33
推荐指数
1
解决办法
5万
查看次数

为什么我使用Knockout JS获得"无法读取属性'nodeType'的null"错误?

今天是Knockout的第一天.得到了它.下面是我使用knockout.js的第一个示例代码,它显示错误.

无法读取null的属性"nodeType"

这是我的剧本:`

   function ViewModel()  
   {  
     var self = this;  
     self.n1 = ko.observable(10);  
     self.n2 = ko.observable(10);  
     self.n3 = ko.observable(10);  
   }  
   ko.applyBindings(new ViewModel());  `
Run Code Online (Sandbox Code Playgroud)

这是我的HTML:

<body>
<p>Number1:<input data-bind="value:n1"></input></p>
<p>Number2:<input data-bind="value:n2"></input></p>
<p>Number3:<input data-bind="value:n3"></input></p>
</body>
Run Code Online (Sandbox Code Playgroud)

我想知道上述错误的原因以及如何克服它...

javascript data-binding html5 mvvm knockout.js

33
推荐指数
2
解决办法
4万
查看次数

在android中使用数据绑定时出错

我想测试数据绑定的指南中给出这里.我已将其包含在我的build.gradle文件中(模块应用程序):

compileSdkVersion 'android-MNC'
buildToolsVersion '23.0.0 rc2'
Run Code Online (Sandbox Code Playgroud)

在项目build.gradle文件中,我已将其包含在我的依赖项中:

classpath "com.android.tools.build:gradle:1.3.0-beta2"
classpath "com.android.databinding:dataBinder:1.0-rc0"
Run Code Online (Sandbox Code Playgroud)

布局文件与指南中给出的文件完全相同.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
   <variable name="user" type="com.example.User"/>
</data>
<LinearLayout
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <TextView android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@{user.firstName}"/>
   <TextView android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

最初它给出了一个错误Element layout does not have the required attribute layout_width and layout_height.

我尝试通过为两者分配match_parent来修复它.然后我Error parsing XML: duplicate attribute在我指定的线layout_heightlayout_width线性布局上得到了错误 .

我再次试图通过删除这些属性来解决这个问题.现在,每当我尝试编译时,我都会看到 - error: package my.package.name.databinding不存在.

代码完成在我的Fragment中完美运行,我试图使用这个布局.

那么我错过了什么?

data-binding android android-fragments

33
推荐指数
2
解决办法
3万
查看次数

Android数据绑定 - '找不到属性的资源标识符'

我的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">

<TextView
      android:text="@string/hello_world"
      android:layout_width="wrap_content"
      app:fontName="Roboto-Regular.ttf"
      android:layout_height="wrap_content"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

我的绑定适配器方法:

public class FontBinding {

  @BindingAdapter("bind:fontName")
  public static void setFontName(TextView view, @NonNull String fontName) {
    String fontPath = "/fonts/" + fontName;

    Typeface typeface = Typeface.createFromAsset(view.getContext().getAssets(), fontPath);

    view.setTypeface(typeface);
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

Error:(8) No resource identifier found for attribute 'fontName' in package 'com.example.databindingproject'
Run Code Online (Sandbox Code Playgroud)

按照https://developer.android.com/tools/data-binding/guide.html中的教程进行操作.我可能做错了什么想法?

data-binding android

33
推荐指数
2
解决办法
9082
查看次数

在'/activity_login.xml'DataBinding文件中找到重复的类,未生成BR

我大多陷入了android数据绑定BR问题.始终有单个activity.xml,但生成的绑定类显示错误.请让我知道如何解决此问题.

在此输入图像描述

data-binding android mvvm viewmodel android-databinding

33
推荐指数
2
解决办法
1万
查看次数