我正在尝试将字符串值列表绑定到列表框,以便逐行列出它们的值.现在我用这个:
<ListBox Margin="20" ItemsSource="{Binding Path=PersonNames}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Id}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
但我不知道我应该把什么放入文本块,而不是Id因为它们都是字符串值,而不是自定义类.
它还抱怨当我在MainPage中将它作为MainPage.PersonNames时,不必找到PersonNames.
我将数据上下文设置为:
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Run Code Online (Sandbox Code Playgroud)
我做错了吗?
在我学习MVVM的过程中,我已经建立了对WPF和ViewModel模式的一些基本理解.我在提供列表时使用以下抽象,并且对单个选定项目感兴趣.
public ObservableCollection<OrderViewModel> Orders { get; private set; }
public ICollectionView OrdersView
{
get
{
if( _ordersView == null )
_ordersView = CollectionViewSource.GetDefaultView( Orders );
return _ordersView;
}
}
private ICollectionView _ordersView;
public OrderViewModel CurrentOrder
{
get { return OrdersView.CurrentItem as OrderViewModel; }
set { OrdersView.MoveCurrentTo( value ); }
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以将OrdersView与支持排序和过滤绑定到WPF中的列表:
<ListView ItemsSource="{Binding Path=OrdersView}"
IsSynchronizedWithCurrentItem="True">
Run Code Online (Sandbox Code Playgroud)
这对单选视图非常有效.但我还想支持视图中的多个选择,并让模型绑定到所选项的列表.
如何将ListView.SelectedItems绑定到ViewModel上的backer属性?
在事件回调中更新模型时更新模型属性对视图没有影响,有什么想法可以解决这个问题吗?
这是我的服务:
angular.service('Channel', function() {
var channel = null;
return {
init: function(channelId, clientId) {
var that = this;
channel = new goog.appengine.Channel(channelId);
var socket = channel.open();
socket.onmessage = function(msg) {
var args = eval(msg.data);
that.publish(args[0], args[1]);
};
}
};
});
Run Code Online (Sandbox Code Playgroud)
publish() 功能是在控制器中动态添加的.
控制器:
App.Controllers.ParticipantsController = function($xhr, $channel) {
var self = this;
self.participants = [];
// here publish function is added to service
mediator.installTo($channel);
// subscribe was also added with publish
$channel.subscribe('+p', function(name) {
self.add(name);
});
self.add = function(name) …Run Code Online (Sandbox Code Playgroud) 我有点惊讶的是,无法通过XAML为Canvas.Children设置绑定.我不得不采用代码隐藏方法,看起来像这样:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
DesignerViewModel dvm = this.DataContext as DesignerViewModel;
dvm.Document.Items.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Items_CollectionChanged);
foreach (UIElement element in dvm.Document.Items)
designerCanvas.Children.Add(element);
}
private void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
ObservableCollection<UIElement> collection = sender as ObservableCollection<UIElement>;
foreach (UIElement element in collection)
if (!designerCanvas.Children.Contains(element))
designerCanvas.Children.Add(element);
List<UIElement> removeList = new List<UIElement>();
foreach (UIElement element in designerCanvas.Children)
if (!collection.Contains(element))
removeList.Add(element);
foreach (UIElement element in removeList)
designerCanvas.Children.Remove(element);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢在XAML中设置一个绑定,如下所示:
<Canvas x:Name="designerCanvas"
Children="{Binding Document.Items}"
Width="{Binding Document.Width}"
Height="{Binding Document.Height}">
</Canvas>
Run Code Online (Sandbox Code Playgroud)
有没有办法在不采用代码隐藏方法的情况下实现这一目标?我已经完成了一些关于这个主题的谷歌搜索,但是对于这个具体问题还没有提出太多.
我不喜欢我当前的方法,因为它通过使View知道它的ViewModel来破坏我的漂亮的Model-View-ViewModel.
我使用DataBindingApi来设置android布局中的视图.这是我的布局.
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="testing.sampleapp.com.sampleapp.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="@{ "Hello " + user.firstName}"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我希望TextView显示Hello UserName.如何使用数据绑定api实现此目的.
我有一个二维的对象数组,我基本上想要将每个对象数据绑定到WPF网格中的单元格.目前我有这个工作,但我在程序上做了大部分工作.我创建了正确数量的行和列定义,然后循环遍历单元格并创建控件并为每个控件设置正确的绑定.
至少我希望能够使用模板来指定xaml中的控件和绑定.理想情况下,我想摆脱程序代码,并使用数据绑定完成所有操作,但我不确定这是否可能.
这是我目前使用的代码:
public void BindGrid()
{
m_Grid.Children.Clear();
m_Grid.ColumnDefinitions.Clear();
m_Grid.RowDefinitions.Clear();
for (int x = 0; x < MefGrid.Width; x++)
{
m_Grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star), });
}
for (int y = 0; y < MefGrid.Height; y++)
{
m_Grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star), });
}
for (int x = 0; x < MefGrid.Width; x++)
{
for (int y = 0; y < MefGrid.Height; y++)
{
Cell cell = (Cell)MefGrid[x, y];
SolidColorBrush brush = new SolidColorBrush(); …Run Code Online (Sandbox Code Playgroud) 我想这样做,默认情况下,当我绑定到我的一个依赖项属性时,绑定模式是双向的,并且update-trigger属性已更改.有没有办法做到这一点?
以下是我的一个依赖项属性的示例:
public static readonly DependencyProperty BindableSelectionLengthProperty =
DependencyProperty.Register(
"BindableSelectionLength",
typeof(int),
typeof(ModdedTextBox),
new PropertyMetadata(OnBindableSelectionLengthChanged));
Run Code Online (Sandbox Code Playgroud) 我在 DataBindingMapperImpl.java 中收到一个特定数据绑定的错误,这导致在构建项目时出现以下错误。
用于代码生成的 ANTLR 工具版本 4.5.3 与当前运行时版本 4.7.1 不匹配。
用于解析器编译的 ANTLR 运行时版本 4.5.3 与当前运行时版本 4.7.1 不匹配用于代码生成的 ANTLR 工具版本 4.5.3 与当前运行时版本 4.7.1
不匹配 用于解析器编译的 ANTLR 运行时版本 4.5.3 与当前运行时版本 4.7.1
/Users/casper/Documents/ARCore/Name /app/build/generated/source/kapt/nameDebug/com/company/name/DataBinderMapperImpl.java:10: 错误:找不到符号
import com.company.name.databinding.ActivitySplashScreenBindingImpl;
^
symbol: class ActivitySplashScreenBindingImpl
> Task :app:kaptNameDebugKotlin FAILED
> Task :app:mergeExtDexNameDebug
location: package com.company.name.databinding
FAILURE: Build failed with an exception.
Run Code Online (Sandbox Code Playgroud)
然后是下面的错误消息...
我遵循了导致此问题的类似帖子here,这是上述错误消息的结尾。
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:kaptNameDebugKotlin'.
> A failure occurred while executing …Run Code Online (Sandbox Code Playgroud) 我遇到了WPF绑定到静态属性的一些问题.在我的应用程序中有一个名为Globals的类,它包含ThisAddIn的静态属性.这个对象允许我访问一个User属性,它基本上是我想在我的Binding中使用的.所以,我的XAML看起来像这样:
<TextBlock Text="{Binding Path=User.Name
, Source={x:Static Member=s:Globals.ThisAddIn}}" />
Run Code Online (Sandbox Code Playgroud)
命名空间s由以下行在顶部声明:
xmlns:s="clr-namespace:ConsoleApplication16.Model"
Run Code Online (Sandbox Code Playgroud)
我发现了很多不同的方法,如何在XAML中引用静态属性,但除了这个之外没有一个工作,这对我来说似乎也是最合乎逻辑的.我发现的一些样本根本没有使用Path或Member.
经过一些测试后我找到了正确的方法,使用"x:Static Member"来定义你想要使用的类和静态属性,而Path在这个对象里面定义了正确的属性,就像普通绑定一样.
尽管此解决方案在没有任何抱怨的情况下进行编译,但会弹出XAMLParseException,直接告诉我StaticExtension值无法解析为枚举,静态字段或静态属性.
仅当我点击另一个控件时,MessageText属性才会更新.更重要的是,如果我按下任何按钮,它的Click处理程序不会执行,而是执行MessageText集.我打破了我的头脑.
<TextBox x:Name="messageText" Grid.Row="1" Grid.Column="0"
TextWrapping="Wrap" Text="{Binding Path=MessageText, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)
private void ChatView_Loaded(object sender, RoutedEventArgs e)
{
DataContext = viewModel;
}
Run Code Online (Sandbox Code Playgroud)
public string MessageText
{
get
{
return this.messageText;
}
set
{
this.messageText = value;
OnProperyChanged("MessageText");
}
}
Run Code Online (Sandbox Code Playgroud)