我可以使用索引绑定到集合项:
<TextBlock FontStyle="Italic" Text="{Binding Path=Exchanges[0].Name}" />
Run Code Online (Sandbox Code Playgroud)
但是使用字典键怎么样?
Path=Exchanges['AMEX'].Name
Run Code Online (Sandbox Code Playgroud) 我在发布之前已经搜索了一些类似的问题 - 但是我在Android和数据绑定方面有一个普遍的问题(我检查的其他答案并没有让我更进一步......).假设你有一个类车辆:
public class Vehicle {
private Owner owner;
private String brand;
//getter and setter for above attributes...
}
Run Code Online (Sandbox Code Playgroud)
这是所有者类....
public class Owner {
private String name;
}
Run Code Online (Sandbox Code Playgroud)
现在 - 我最近正在研究微软WPF采用的MVVM(ModelView-ViewModel)模式.这让我想知道:假设我想绑定我的所有者对象的name属性,这是Vehicle对象的子对象 - 在Android中是否会有一些标准方法来实现这一点?还假设,在我可以更新模型之前,我可能必须验证输入?
我想象以下组件(假设MVVM):
现在,当我将EditTexts,TextViews等添加到视图中时,我希望它们绑定到我的上下文对象的某些属性(在这种情况下为Vehicle)......如果我的问题不明确或者您需要进一步的信息,请执行此操作让我知道:)提前谢谢.
Ps我认为熟悉WPF的人现在可能是我的意思吗?我自己刚刚阅读了WPF并发现它是处理内容的好方法.
PPs我知道android绑定项目,但我想知道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_height和layout_width线性布局上得到了错误
.
我再次试图通过删除这些属性来解决这个问题.现在,每当我尝试编译时,我都会看到 - error: package my.package.name.databinding不存在.
代码完成在我的Fragment中完美运行,我试图使用这个布局.
那么我错过了什么?
我有几个复杂的数据结构,如
Map< A, Set< B > >
Set< Map< A, B > >
Set< Map< A, Set< B > > >
Map< A, Map< B, Set< C > > >
and so on (more complex data structures)
Run Code Online (Sandbox Code Playgroud)
注意:在我的情况下,如果我使用Set或List并不重要.
现在我知道JAXB允许我定义XmlAdapter,这没关系,但我不想为每个给定的数据结构定义一个XmlAdapter(它只是太多的复制和粘贴代码).
我试图通过声明两个泛化XmlAdapter来实现我的目标:
MapAdapter<K,V>SetAdapter<V>问题:
JAXB抱怨如下:
javax.xml.bind.JAXBException:
class java.util.Collections$UnmodifiableMap nor any of its
super class is known to this context.
Run Code Online (Sandbox Code Playgroud)
这是我的适配器类:
import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.*;
public class Adapters {
public final static class MapAdapter<K, V> …Run Code Online (Sandbox Code Playgroud) 我一直在尝试将一个Entity Framework对象绑定到一个DataGridView,但我一直在追求死胡同,我似乎无法在任何地方找到我的答案.
我可以将整个表(实体)绑定到gridview,它将允许我进行更改并将这些更改保存回DB,如下所示:
WS_Model.WS_Entities context;
private void simpleButton1_Click(object sender, EventArgs e)
{
context = new WS_Entities();
var query = from c in context.Users select c;
var users = query.ToList();
gridControl1.DataSource = users;
}
private void simpleButton2_Click(object sender, EventArgs e)
{
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
但我不想在我的数据库视图中查看数据库中表格中的所有列,所以我尝试这样做...
WS_Entities context = new WS_Entities();
private void simpleButton1_Click(object sender, EventArgs e)
{
var query = from c in context.Users
where c.UserName == "James"
select new { c.UserName, c.Password, c.Description };
var results = query.ToList();
gridControl1.DataSource = results; …Run Code Online (Sandbox Code Playgroud) 我想知道我是否可以从viewModel本身范围之外的方法访问knockout.js主viewModel.举个例子:
function Employee(data) {
var self = this;
ko.mapping.fromJS(data, {}, this);
}
function EmployeeViewModel() {
var self = this;
this.employees = ko.observableArray([]);
this.loadEmployees = function() {
var mappedEmployees= $.map(JSON.parse(data.value), function(item) { return new Employee(item) });
self.employees (mappedEmployees);
}
}
// here's the part I'm curious about
$(document).ready(function() {
ko.applyBindings(new EmployeeViewModel());
$("#myLink").click(function() {
// is there some way to get back into the ko context here?
// like with ko.dataFor or ko.contextFor?
});
}
Run Code Online (Sandbox Code Playgroud) 我正在为几个窗口共享的一系列控件创建一个UserControl.其中一个控件是Label,它根据"协议编号"显示其他一些过程的流程.
我正在尝试使用此Label提供DataBinding,因此Window会在协议编号变量更改时自动反映进程的状态.
这是用户控件XAML:
<UserControl Name="MainOptionsPanel"
x:Class="ExperienceMainControls.MainControls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
<Label Height="Auto" Name="numberLabel">Protocol:</Label>
<Label Content="{Binding Path=ProtocolNumber}" Name="protocolNumberLabel"/>
(...)
</UserControl>
Run Code Online (Sandbox Code Playgroud)
这就是Code-Behind:
public partial class MainControls
{
public MainControls()
{
InitializeComponent();
}
public int ProtocolNumber
{
get { return (int)GetValue(ProtocolNumberProperty); }
set { SetValue(ProtocolNumberProperty, value); }
}
public static DependencyProperty ProtocolNumberProperty =
DependencyProperty.Register("ProtocolNumber", typeof(int), typeof(MainControls));
}
Run Code Online (Sandbox Code Playgroud)
这似乎是有效的,因为如果在构造函数中我将ProtocolNumber设置为任意值,它将反映在用户控件中.
但是,在最终窗口上使用此用户控件时,数据绑定会中断.
XAML:
<Window x:Class="UserControlTesting.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:expControl="clr-namespace:ExperienceMainControls;assembly=ExperienceMainControls"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
<StackPanel>
<expControl:MainControls ProtocolNumber="{Binding Path=Number, Mode=TwoWay}" />
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
窗口的代码隐藏:
public partial class …Run Code Online (Sandbox Code Playgroud) 我知道在一些谷歌线程中已经说过这个,但我仍然找不到将我的无线电输入绑定到模型的正确解决方案(以简洁的方式),
目前我有HTML:
<input ng-model="searchByRma" type="radio" name="search-type">
<input ng-model="searchByDelivery" type="radio" name="search-type">
Run Code Online (Sandbox Code Playgroud)
在控制器中:
$scope.searchByRma = true;
$scope.searchByDelivery = false;
Run Code Online (Sandbox Code Playgroud)
这不起作用(就像复选框一样)......
有关如何在第一个单选按钮上设置默认值而不丢失数据绑定的任何想法?
谢谢!
我有一个项目,它会抛出一些数据绑定错误.一个例子是:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
我的问题是,是否有办法确定实际声明此绑定的位置(无论是在XAML中还是在代码中声明).
到目前为止我尝试过的:
HorizontalContentAlignment; 我发现只有一个并删除它但我仍然收到消息,这似乎表明那不是错误的...你知道有什么其他的技巧可以让WPF吐出一些更有用的信息,说明这个绑定的确切位置在哪里?
UPDATE
经过一点点搜索后,我很确定这是由某种风格应用于某种原因造成的MenuItem.但是,我仍然无法确定声明错误绑定的位置.
更新2
我发现了这个问题.然而问题仍然存在,因为发现问题主要是基于错误消息中的有限信息在黑暗中搜索.
事实证明,绑定是以一种样式声明的.风格不在我的应用程序中.这可能是默认的风格MenuItem.所以为了解决这个问题,我现在只需手动设置HorizontalContentAlignment全部MenuItems.错误的原因在某种程度上与操作顺序有关,因为这MenuItem是在代码中生成的.我将分别发布一个新问题.
因此,就目前而言,故事的寓意是我觉得需要有一个更好的机制来确定故障绑定的声明位置.我希望看到类似绑定的堆栈跟踪...
如果有人知道确定在代码或标记中声明绑定的位置的任何其他工具或方法,我会将问题保持打开一段时间.
我发布了另一个关于应用于MenuItems此处的样式/绑定的问题.
试图学习如何将对象绑定到各种类型的控件.在这个例子中,我想让我的对象中的示例数据出现在ComboBox中.代码运行,但出现的不是值(David,Helen,Joe)是文本"TheProtect.UserControls.Client")
XAML:(ucDataBindingObject.xaml)
<UserControl x:Class="TheProject.UserControls.ucDataBindingObject"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Width="Auto"
Height="Auto"
mc:Ignorable="d">
<Grid Width="130"
Height="240"
Margin="0">
<ComboBox Width="310"
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemsSource="{Binding Path=Clients}" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
C#:ucDataBindingObject.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
namespace TheProject.UserControls
{
public partial class ucDataBindingObject : UserControl
{
public List<Client> Clients { get; set; }
public ucDataBindingObject()
{
Clients = new List<Client>();
Clients.Add(new Client(1, "David")); // sample data
Clients.Add(new Client(2, "Helen"));
Clients.Add(new Client(3, "Joe"));
InitializeComponent();
this.DataContext = this;
}
}
Run Code Online (Sandbox Code Playgroud)
C#Client.cs
using System;
using System.Linq; …Run Code Online (Sandbox Code Playgroud) data-binding ×10
wpf ×5
xaml ×3
android ×2
c# ×2
angularjs ×1
combobox ×1
datagridview ×1
dictionary ×1
java ×1
javascript ×1
jaxb ×1
knockout.js ×1
object ×1
scope ×1
winforms ×1
xml ×1