标签: data-binding

如何使数据绑定类型安全并支持重构

当我希望将控件绑定到我的对象的属性时,我必须提供属性的名称作为字符串.这不是很好,因为:

  1. 如果删除或重命名该属性,我不会收到编译器警告.
  2. 如果使用重构工具重命名该属性,则很可能不会更新数据绑定.
  3. 如果属性的类型错误,我在运行时之前不会收到错误,例如将整数绑定到日期选择器.

是否有一个设计模式可以解决这个问题,但仍然易于使用数据绑定?

(这是WinForm,Asp.net和WPF中的一个问题,很可能是很多其他系统)

我现在已经找到了" C#中的nameof()运算符的变通方法:typesafe databinding ",它也是解决方案的一个很好的起点.

如果您在编译代码后愿意使用后处理器,那么notifypropertyweaver非常值得关注.


当绑定在XML而不是C#中完成时,任何人都知道WPF的良好解决方案吗?

.net c# data-binding refactoring type-safety

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

从ContextMenu中的MenuItem绑定ElementName

是否有人注意到带有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中包含的绑定之外,所有绑定都很有效.它们在运行时将错误输出到"输出"窗口.

有谁知道任何工作?这里发生了什么?

data-binding wpf contextmenu elementname

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

将集合绑定到StackPanel

我想获取一个对象集合并将其绑定到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)

c# data-binding silverlight xaml

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

Android - DataBinding - 如何以及何时生成绑定类?

数据绑定指南

  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)

任何帮助表示赞赏.谢谢

data-binding android

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

使用数据绑定到图像src属性的Knockout模板不起作用

我看不出这里有什么问题,但使用以下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.

data-binding knockout.js knockout-templating

65
推荐指数
1
解决办法
7万
查看次数

图像UriSource和数据绑定

我正在尝试将自定义对象列表绑定到WPF图像,如下所示:

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath}" />
    </Image.Source>
</Image>
Run Code Online (Sandbox Code Playgroud)

但它不起作用.这是我得到的错误:

必须设置"Property'UriSource'或属性'StreamSource'."

我错过了什么?

.net data-binding wpf xaml

64
推荐指数
6
解决办法
13万
查看次数

在XE3中使用自动更新进行实时绑定(无需像在XE2中那样调用Notify())

我目前正在使用Delphi XE2,并听说他们在XE3中使用自动更新进行新的Live Binding(无需像XE2那样调用Notify()).

在C#或Delphi XE2中我们必须实现INotifyPropertyChanged(Notify();在Delphi中),这种方法确实有意义,因为我们可以完全控制要更新的内容以及何时更新它,这样我们就可以轻松调整性能并实现虚拟化.

但我只是想知道它是如何工作的,它们为实现它做了什么样的机制,我不知道它们是如何做到的,以下是可能用于实现自动更新的假设.

  1. 计时器:计时器经常打勾并刷新所有数据

    性能非常慢没有虚拟化

  2. 编译器级别功能:notify() events编译器自动执行的所有相关代码

    很多头脑

  3. 索姆其他方法:

请帮助我确定他们是如何实现它的.

我目前正在使用XE3试用版,因此我无法访问源代码,您的答案将帮助我决定是否切换到新功能.
我有一个类(集合项)有400个属性要绑定(并非所有时间都是这样),所以性能确实在我的应用程序的稳定性中发挥了重要作用.

delphi data-binding virtualization performance delphi-xe3

64
推荐指数
1
解决办法
1755
查看次数

从Code Behind调用命令

所以我一直在四处寻找并且无法确切地知道如何做到这一点.我正在使用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)

我确信有一个简单的方法可以做到这一点,但我不能为我的生活弄清楚.

c# data-binding wpf xaml command

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

数据绑定表达式未编译

我正在尝试新的数据绑定库.我有一个奇怪的问题,绑定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声明时,一切都编译(并且有效!)

我不知道我在这里缺少什么

data-binding android

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

如何将WPF中的命令绑定到控件的双击事件处理程序?

我需要将文本块的双击事件(或者可能是图像 - 无论哪种方式,它的用户控件)绑定到我的ViewModel中的命令.

TextBlock.InputBindings似乎没有正确绑定到我的命令,任何帮助?

data-binding wpf command double-click mvvm

62
推荐指数
4
解决办法
7万
查看次数