当我希望将控件绑定到我的对象的属性时,我必须提供属性的名称作为字符串.这不是很好,因为:
是否有一个设计模式可以解决这个问题,但仍然易于使用数据绑定?
(这是WinForm,Asp.net和WPF中的一个问题,很可能是很多其他系统)
我现在已经找到了" C#中的nameof()运算符的变通方法:typesafe databinding ",它也是解决方案的一个很好的起点.
如果您在编译代码后愿意使用后处理器,那么notifypropertyweaver非常值得关注.
当绑定在XML而不是C#中完成时,任何人都知道WPF的良好解决方案吗?
是否有人注意到带有ElementName的Bindings无法正确解析MenuItem对象中包含的ContextMenu对象?看看这个样本:
<Window x:Class="EmptyWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
x:Name="window">
<Grid x:Name="grid" Background="Wheat">
<Grid.ContextMenu>
<ContextMenu x:Name="menu">
<MenuItem x:Name="menuItem" Header="Window" Tag="{Binding ElementName=window}" Click="MenuItem_Click"/>
<MenuItem Header="Grid" Tag="{Binding ElementName=grid}" Click="MenuItem_Click"/>
<MenuItem Header="Menu" Tag="{Binding ElementName=menu}" Click="MenuItem_Click"/>
<MenuItem Header="Menu Item" Tag="{Binding ElementName=menuItem}" Click="MenuItem_Click"/>
</ContextMenu>
</Grid.ContextMenu>
<Button Content="Menu"
HorizontalAlignment="Center" VerticalAlignment="Center"
Click="MenuItem_Click" Tag="{Binding ElementName=menu}"/>
<Menu HorizontalAlignment="Center" VerticalAlignment="Bottom">
<MenuItem x:Name="anotherMenuItem" Header="Window" Tag="{Binding ElementName=window}" Click="MenuItem_Click"/>
<MenuItem Header="Grid" Tag="{Binding ElementName=grid}" Click="MenuItem_Click"/>
<MenuItem Header="Menu" Tag="{Binding ElementName=menu}" Click="MenuItem_Click"/>
<MenuItem Header="Menu Item" Tag="{Binding ElementName=anotherMenuItem}" Click="MenuItem_Click"/>
</Menu>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
除了ContextMenu中包含的绑定之外,所有绑定都很有效.它们在运行时将错误输出到"输出"窗口.
有谁知道任何工作?这里发生了什么?
我想获取一个对象集合并将其绑定到StackPanel,所以基本上如果集合有4个元素,在堆栈面板中应该产生4个按钮.
我尝试过这个......但我不认为它是正确的方法.我过去曾使用DataTemplated来做这种想法..如果我错了,请纠正我.
这是我的假模特
public class MockModel
{
public ObservableCollection<MockNode> Nodes;
public MockModel()
{
Nodes = new ObservableCollection<MockNode>();
}
}
public class MockNode
{
public MockNode()
{
}
private string itemname;
public string ItemName
{
get { return this.itemname; }
set { this.itemname = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
在代码中我像这样设置DataContext ......
// Init Model
MockModel myModel = new MockModel();
for (int i = 0; i < 4; i++)
{
MockNode mn = new MockNode();
mn.ItemName = String.Format("Node {0}", i);
myModel.Nodes.Add(mn);
}
// …Run Code Online (Sandbox Code Playgroud) By default, a Binding class will be generated based on the name of the layout
file, converting it to Pascal case and suffixing “Binding” to it.
The above layout file was activity_main.xml so the generate class was ActivityMainBinding.
Run Code Online (Sandbox Code Playgroud)
什么时候会生成Binding类,比如说ActivityMainBinding.我有编译时错误."无法解析ActivityMainBinding".
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.谢谢
我看不出这里有什么问题,但使用以下Knockout模板无法显示图像:
<script type="text/html" id="legend-template">
<div><input type="checkbox" data-bind="click : doSomething" ></input>
<img width="16px" height="16px" data-bind="src: 'imagePath'" />
<span data-bind="text : label"> </span>
</div>
</script>
Run Code Online (Sandbox Code Playgroud)
这个绑定的对象看起来像这样:
tut.myObject= function (imagePath, label) {
this.label = ko.observable(label);
this.imagePath = ko.observable(imagePath || liveString + '/Content/images/marker.png');
};
tut.myObject.prototype = {
doSomething: function () { alert("do what?");
}
};
Run Code Online (Sandbox Code Playgroud)
渲染HTML对象时,我看到标签,然后单击复选框调用doSomething.
TIA.
我正在尝试将自定义对象列表绑定到WPF图像,如下所示:
<Image>
<Image.Source>
<BitmapImage UriSource="{Binding Path=ImagePath}" />
</Image.Source>
</Image>
Run Code Online (Sandbox Code Playgroud)
但它不起作用.这是我得到的错误:
必须设置"Property'UriSource'或属性'StreamSource'."
我错过了什么?
我目前正在使用Delphi XE2,并听说他们在XE3中使用自动更新进行新的Live Binding(无需像XE2那样调用Notify()).
在C#或Delphi XE2中我们必须实现INotifyPropertyChanged(Notify();在Delphi中),这种方法确实有意义,因为我们可以完全控制要更新的内容以及何时更新它,这样我们就可以轻松调整性能并实现虚拟化.
但我只是想知道它是如何工作的,它们为实现它做了什么样的机制,我不知道它们是如何做到的,以下是可能用于实现自动更新的假设.
计时器:计时器经常打勾并刷新所有数据
性能非常慢没有虚拟化
编译器级别功能:notify() events编译器自动执行的所有相关代码
很多头脑
索姆其他方法:
请帮助我确定他们是如何实现它的.
我目前正在使用XE3试用版,因此我无法访问源代码,您的答案将帮助我决定是否切换到新功能.
我有一个类(集合项)有400个属性要绑定(并非所有时间都是这样),所以性能确实在我的应用程序的稳定性中发挥了重要作用.
所以我一直在四处寻找并且无法确切地知道如何做到这一点.我正在使用MVVM创建用户控件,并希望在'Loaded'事件上运行命令.我意识到这需要一些代码,但我无法弄清楚需要什么.该命令位于ViewModel中,它被设置为视图的datacontext,但我不确定如何路由它,所以我可以从加载的事件后面的代码中调用它.基本上我想要的是这样的......
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
//Call command from viewmodel
}
Run Code Online (Sandbox Code Playgroud)
环顾四周,我无法在任何地方找到这种语法.我是否需要先在xaml中绑定命令才能引用它?我注意到用户控件中的命令绑定选项不会让你像按钮那样绑定命令......
<UserControl.CommandBindings>
<CommandBinding Command="{Binding MyCommand}" /> <!-- Throws compile error -->
</UserControl.CommandBindings>
Run Code Online (Sandbox Code Playgroud)
我确信有一个简单的方法可以做到这一点,但我不能为我的生活弄清楚.
我正在尝试新的数据绑定库.我有一个奇怪的问题,绑定visibility属性不编译.
这是xml文件的简化版本:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="header"
type="com.example.EmailHeader" />
</data>
<RelativeLayout ... >
<TextView
...
android:text="@{header.senderName ?? header.senderAddress}"
android:visibility="@{header.hasAttachment ? View.VISIBLE : View.INVISIBLE}" />
</RelativeLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
编译时我得到以下消息:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
Run Code Online (Sandbox Code Playgroud)
java.lang.RuntimeException:发现数据绑定错误.****/数据绑定错误****消息:标识符必须具有XML文件中的用户定义类型.视图缺少它
当我删除android:visiblity声明时,一切都编译(并且有效!)
我不知道我在这里缺少什么
我需要将文本块的双击事件(或者可能是图像 - 无论哪种方式,它的用户控件)绑定到我的ViewModel中的命令.
TextBlock.InputBindings似乎没有正确绑定到我的命令,任何帮助?
data-binding ×10
wpf ×4
c# ×3
xaml ×3
.net ×2
android ×2
command ×2
contextmenu ×1
delphi ×1
delphi-xe3 ×1
double-click ×1
elementname ×1
knockout.js ×1
mvvm ×1
performance ×1
refactoring ×1
silverlight ×1
type-safety ×1