在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)
了解这两个概念的最佳方法是什么,以了解何时以及如何在各种编码方案中应用它们?
在WPF的View-Model-ViewModel模式下,我试图为网格控件的各种定义的高度和宽度进行数据绑定,因此我可以在使用GridSplitter后存储用户设置它们的值.但是,正常模式似乎不适用于这些特定属性.
注意:我发布这个作为参考问题,我发布谷歌失败了我,我不得不自己解决这个问题.我自己的答案可以遵循.
我有一个带有索引器属性的类,带有一个字符串键:
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,因为索引不是基于整数的.从技术上讲,该对象无论如何都不是一个集合.
我可以这样做,等等,怎么样?
我有以下MainView.xaml文件,它可以很好地用作MVVM菜单切换器.我有这些配对:
在我的MainViewModel中,我用两个ViewModel填充ObservableCollection,然后当用户单击Next按钮时,它调用MainViewModel中的NextPageCommand,它将一个新的ViewModel 切换出CurrentPageViewModel,然后用适当的View显示,效果很好.
我还有一个菜单填充了Observable集合中ViewModels的所有标题,这也很好用.
但是,每个MenuItem都有一个Command ="{Binding SwitchPageCommand}",它应该在MainViewModel上调用SwitchPageCommand,而不是在例如Page1ViewModel或Page2ViewModel上调用.
那么我怎么能在模板中指出不要绑定到当前的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) 我有两个独立的可见性转换器,一个基于字段是否已更新,另一个基于是否允许查看字段.我对我页面上的每个文本项使用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) 作为将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)
你在这里.现在,你需要设置Settings为DataContext为SearchSettings控制,对Label内部绑定反对,但你不能,因为这会触发重新绑定的Settings属性.
我看不到在使用不同来源的混合绑定属性点:DataContext通过ElementName等,那么,为什么我会永远使用DataContext?
今天是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)
我想知道上述错误的原因以及如何克服它...
我想测试数据绑定的指南中给出这里.我已将其包含在我的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_height和layout_width线性布局上得到了错误
.
我再次试图通过删除这些属性来解决这个问题.现在,每当我尝试编译时,我都会看到 - error: package my.package.name.databinding不存在.
代码完成在我的Fragment中完美运行,我试图使用这个布局.
那么我错过了什么?
我的布局文件:
<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 ×10
wpf ×6
android ×3
mvvm ×3
c# ×1
column-width ×1
converter ×1
datacontext ×1
grid ×1
html5 ×1
indexer ×1
itemssource ×1
javascript ×1
knockout.js ×1
row-height ×1
viewmodel ×1
xaml ×1