在GridView ItemTemplate中使用多个EVAL字段的最佳方法是什么?
希望能够控制外观的格式以及设置超链接/ javascript等.
我反复遇到这个问题,并且不知道造成它的原因.我在DataBind中得到一个异常:SelectedValue which is invalid because it does not exist in the list of items.
以下是一些重要的信息:
listOrgs.Items.Clear();
listOrgs.SelectedValue = "0";
listOrgs.DataSource = new Organization().DTListAll(SiteID);
listOrgs.DataTextField = "OrganizationName";
listOrgs.DataValueField = "OrganizationID";
listOrgs.DataBind();
Run Code Online (Sandbox Code Playgroud) 我使用WPF数据绑定实现IDataErrorInfo接口的实体.一般来说,我的代码如下所示:
商业实体:
public class Person : IDataErrorInfo
{
public string Name { get; set;}
string IDataErrorInfo.this[string columnName]
{
if (columnName=="Name" && string.IsNullOrEmpty(Name))
return "Name is not entered";
return string.Empty;
}
}
Run Code Online (Sandbox Code Playgroud)
Xaml文件:
<TextBox Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnDataErrors=true}" />
Run Code Online (Sandbox Code Playgroud)
当用户点击"创建新人"后执行以下代码:
DataContext = new Person();
Run Code Online (Sandbox Code Playgroud)
问题是,当刚创建person时,其名称为空,WPF会立即绘制红框并显示错误消息.我希望它仅在名称已编辑且焦点丢失时显示错误.有人知道这样做的方法吗?
我想我很清楚BindingSource类的作用 - 即在数据源和UI控件之间提供一个间接层.它实现了IBindingList接口,因此也提供了对排序的支持.而且我经常使用它,没有太多问题.但我想知道我是否经常使用它而不是我应该使用它.也许一个例子会有所帮助.
假设我在表单上只有一个简单的文本框(使用WinForms),我想将该文本框绑定到返回字符串的类中的简单属性.在这种情况下使用BindingSource值得吗?
现在让我说我的表单上有一个网格,我想将它绑定到DataTable.我现在应该使用BindingSource吗?
在后一种情况下,我可能不会使用BindingSource作为DataTable从我可以收集的内容中提供与BindingSource本身相同的功能.当添加,删除行等时,DataTable将触发正确的事件,以便网格自动更新.
但是在第一种情况下,文本框被绑定到一个字符串,我可能会让包含字符串属性的类实现INotifyPropertyChanged,这样它就可以在字符串更改时触发PropertyChanged事件.我会使用BindingSource,以便它可以监听这些PropertyChanged事件,以便它可以在字符串更改时自动更新文本框.
到目前为止这听起来怎么样?我仍然觉得我的理解存在差距,这使我无法看到整体情况.到目前为止,这是一个非常模糊的问题,所以我会尝试提出一些更具体的问题 - 理想情况下,答案会引用上面的例子或类似的东西......
(1)在上述任何一个例子中是否值得使用BindingSource?
(2)似乎开发人员只是"假设"DataTable类在正确的时间触发PropertyChanged事件时会做正确的事情.如何知道数据源是否能够执行此操作?是否存在数据源应该实现的特定接口,以便开发人员能够承担此行为?
(3)在考虑是否使用BindingSource时,控制绑定的是否重要?或者只是影响决策的数据源?也许答案是(这看起来足够合乎逻辑):Control需要足够智能以监听PropertyChanged事件,否则需要BindingSource.那么如何判断Control是否能够做到这一点呢?同样,开发人员可以寻找控件必须实现的特定接口吗?
正是这种困惑在过去导致我总是使用BindingSource.但是我想更好地理解何时使用它,所以我只在必要时这样做.
我有一个包含许多对象的WPF/Entity Framework(4.0)项目.我想构建应用程序,以便我可以在视图模型中共享对象选择状态.
例如:我们有汽车,司机,乘客和货物类.我们还有CarList,DriverList等的UserControls以及CarEditor,DriverEditor等的编辑器窗口.此外,我们有所有这些的视图模型(CarListViewModel,DriverListViewModel,CargoEditorViewModel等).这一切都构成了一个可停靠的界面,用户可以在其中打开多个对象列表,编辑器和查看器.
我想要的是如何连接多个视图模型的具体代码示例,以便在CarList中选择汽车将使该汽车在CarEditorView中生效,但也可以在上下文有效的任何其他视图中选择(例如如果有过滤谓词,则为DriverByCarView-或仅为DriverList.
基于这个问题,有许多建议和讨论.似乎占主导地位的两种方法是:
这些方法中的一种比另一种更好吗?
有没有人以书面或小代码项目的形式有这两种方法的具体例子?
我还在学习WPF,所以对于阅读API基础知识的入门点的建议表示赞赏,但查看代码示例是我经常去的地方.
谢谢
如果有人有兴趣,这里有一些其他类似的讨论:
我的wpf应用程序中有一个datagrid,我有一个简单的问题.我有一个通用列表,我希望每次将对象添加到集合时将此集合绑定到我的数据网格数据源.我对使用可观察的集合不感兴趣.
关键是我在其他地方使用相同的方法,并且工作正常.但是这次当我按下Add按钮时,会添加一个对象并且datagrid会正确更新,但是从添加到集合datagrid的第二个项目不再更新.
这是代码:
private void btnAddItem_Click(object sender, RoutedEventArgs e)
{
OrderDetailObjects.Add(new OrderDetailObject
{
Price = currentitem.Price.Value,
Quantity = int.Parse(txtQuantity.Text),
Title = currentitem.DisplayName,
TotalPrice = currentitem.Price.Value * int.Parse(txtQuantity.Text)
});
dgOrderDetail.ItemsSource = OrderDetailObjects;
dgOrderDetail.UpdateLayout();
}
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
我将文本框绑定到对象,如下所示:
<TextBlock d:DataContext="{d:DesignInstance ViewModel:TaskVM }"
Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown">
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何在设计过程中显示模拟数据.我尝试过这样的事情:
<TextBlock Text="{Binding Path=Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown">
<d:DesignProperties.DataContext>
<ViewModel:TaskVM Title="Mock"/>
</d:DesignProperties.DataContext>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
但是,由于TaskVM没有默认的ctor,我找到了"No default constructor".
我知道当我使用d:DataContext="{d:DesignInstance ViewModel:TaskVM }"它时会创建一个模拟数据类型.有没有办法让我设置这个模拟类型的属性?
谢谢!
很简单的问题,但似乎无法在这里找到完整的答案......
我需要在xaml中将数据绑定到codebehind中的类成员的属性.
<Window x:Class="Main">
<customcontrol Name="View" IsChecked="{Binding ElementName=RecordProp, Path=IsViewChecked}" />
...
Run Code Online (Sandbox Code Playgroud)
背后的代码如下所示:
class Main
{
...
private Record _record;
public Record RecordProp
{
get { return _record; }
}
...
}
class Record
{
public bool IsViewChecked
{
get; set;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在得到的东西不起作用,我做错了什么?
如果我更新了我的ViewModel包装的Model对象,那么触发我的ViewModel公开的所有模型属性的属性更改通知的好方法是什么?
我正在开发遵循MVVM模式的WPF客户端,并且我正在尝试处理从服务到我的视图中显示的数据的传入更新.当客户端收到更新时,更新以DTO的形式出现,我将其用作模型.
如果此模型是对View中显示的现有模型的更新,我希望关联的ViewModel更新其数据绑定属性,以便View反映更改.
让我举一个例子来说明.考虑我的模型:
class FooModel
{
public int FooModelProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
包含在ViewModel中:
class FooViewModel
{
private FooModel _model;
public FooModel Model
{
get { return _model; }
set
{
_model = value;
OnPropertyChanged("Model");
}
}
public int FooViewModelProperty
{
get { return Model.FooModelProperty; }
set
{
Model.FooModelProperty = value;
OnPropertyChanged("FooViewModelProperty");
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
当更新的模型到达时,我设置了ViewModel的Model属性,如下所示:
instanceOfFooVM.Model = newModel;
Run Code Online (Sandbox Code Playgroud)
这会导致OnPropertyChanged("Model")触发,但不是OnPropertyChanged("FooViewModelProperty"),除非我明确地从后者Model设置后者.因此FooViewModelProperty,当我更改模型时,绑定的视图将不会更新以显示该属性的新值.
明确地调用OnPropertyChanged每个公开的Model属性显然不是一个理想的解决方案,也没有采用newModel并迭代其属性来逐个更新ViewModel的属性. …
有谁知道com.fasterxml.jackson.databind.ObjectMapper如何能够将JSON属性映射到不区分大小写的POJO属性?
JSON字符串:
[{ "FIRSTNAME": "约翰", "LASTNAME": "Doe的", "DATEOFBIRTH": "1980-07-16T18:25:00.000Z"}]
POJO级:
public class Person {
private String firstName;
private String lastName;
private Date dateOfBirth;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
Run Code Online (Sandbox Code Playgroud)
测试类:
@Test
public final void testDeserializingPersonJsonToPersonClass()
throws JsonParseException, …Run Code Online (Sandbox Code Playgroud) data-binding ×10
wpf ×5
.net ×3
c# ×3
asp.net ×2
mvvm ×2
code-behind ×1
datagrid ×1
eval ×1
fasterxml ×1
gridview ×1
itemsource ×1
java ×1
json ×1
validation ×1
winforms ×1
xaml ×1