这是我的窗口代码:
public partial class MainWindow
{
private MainWindowViewModel _mainWindowViewModel;
public MainWindow()
{
InitializeComponent();
_mainWindowViewModel = new MainWindowViewModel();
DataContext = _mainWindowViewModel;
}
}
Run Code Online (Sandbox Code Playgroud)
和视图模型代码:
class MainWindowViewModel : ViewModelBase
{
private BidirectionalGraph<string, IEdge<string>> _graph;
public BidirectionalGraph<string, IEdge<string>> Graph
{
get { return _graph; }
set
{
_graph = value;
NotifyPropertyChanged("Graph");
}
}
public MainWindowViewModel()
{
Graph = new BidirectionalGraph<string, IEdge<string>>();
// test data
const string vertex1 = "123";
const string vertex2 = "456";
const string vertex3 = "ddd";
Graph.AddVertex(vertex1);
Graph.AddVertex(vertex2);
Graph.AddVertex(vertex3);
Graph.AddEdge(new …Run Code Online (Sandbox Code Playgroud) 我正在使用带有Entity Framework模型的MVVM模式在C#中编写桌面应用程序.我倾向于在我的VM中使用DependencyProperties并且(通常)更喜欢这个系统而不是实现INotifyPropertyChanged.我想保持一致.我的虚拟机访问模型中的实体,我设法将事物分开 - 视图除了绑定和命令名称之外没有知道VM,并且模型已知道VM的知识.
在VM中使用INotifyPropertyChanged,更新模型中的实体似乎很容易:
public string Forename
{
get { return CurrentPerson.Forename; }
set
{
if (Forename != value)
{
CurrentPerson.Forename = value;
NotifyPropertyChanged("Forename");
}
}
}
Run Code Online (Sandbox Code Playgroud)
...其中CurrentPerson是由实体数据模型自动创建的Person对象.因此,没有专门用于存储Forename的私有字段.
使用DependencyProperties,似乎我必须使用GetValue和Setvalue创建DP,添加默认属性,然后使用PropertyChangedCallback来更新CurrentPerson实体.在这种情况下调用回调似乎增加了开销,以便与我的其他VM保持一致.
问题是,这些方法中的一种或另一种是我应该做的事情吗?在这种情况下,我应该使用DependencyProperty还是INotifyPropertyChanged?应该指出的一点是,这可能是一个非常大规模的项目(插件和来自不同机器的大量数据库访问),并且所有内容都应该是可重用的,并且模块尽可能"断开连接" .
c# wpf entity-framework dependency-properties inotifypropertychanged
我正在使用一个使用MVVM的Windows Phone应用程序,但我正在努力实现MVVM,以便需要从模型类格式化以在视图中显示的属性.
假设我有一个简单的模型类叫做Person.
public class Person {
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有名单Person,是根据本地保存的文件加载的对象,我想显示一个列表页面上的人员名单,然后让一个人的用户水龙头导航到详细信息页面,那里有更多这方面的细节人.
在列表页面上,我想将此人的生日显示为"生日:2/22/1980"(其中"2/22/1980"是该人的格式Birthday)
在详细信息页面上,我想以不同的格式显示此人的生日:"Eric的生日是2/22/1980"(其中"Eric"是此人Name,"2/22/1980"是该人的格式Birthday).
通常,我会创建一个Birthday正确格式化的视图模型:
public class PersonViewModel {
private Person person;
public PersonViewModel(Person person) {
this.person = person;
}
public string BirthdayForList {
get {
return "Birthday: " + person.Birthday.ToString("ddd", CultureInfo.CurrentCulture);
}
}
public string BirthdayForDetails {
get {
return person.Name + "'s birthday is " …Run Code Online (Sandbox Code Playgroud) 也许这是非常错误的。我有一个文本框,希望该文本框中的值与类的成员同步。我以为我使用了绑定,但我无法控制它。我在下面尝试过,但不起作用。我哪里想错了?
这是我的 XAML:
<Window x:Class="tt_WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:tt_WPF"
Title="MainWindow" SizeToContent="WidthAndHeight">
<StackPanel>
<TextBox x:Name="tb" Width="200" Text="{Binding local:abc.Name}"></TextBox>
<Button Click="Button_Click">Ok</Button>
</StackPanel> </Window>
Run Code Online (Sandbox Code Playgroud)
这是背后的代码:
public class ABC
{
public string Name { get; set; }
}
public partial class MainWindow : Window
{
private ABC abc = new ABC();
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{ }
}
Run Code Online (Sandbox Code Playgroud) 一段时间以来,我一直在想.假设我有一个简单的应用程序在WPF中制作,在画布中有单个矩形.我可以在mousemove上使用Canvas.Left和Canvas.Top移动此矩形.但是,我想我也想根据一些计算改变这个矩形的颜色并改变它的宽度和高度.我可以通过从我的viewmodel绑定依赖项属性来做到这一点.然而,随着我的项目进展,我的视图模型变得越来越大.我希望将它的一些逻辑封装在分离的对象中.所以我为我的Rectangle创建了一个类,包含background,posX,posY,width和height等属性.
问题是,所有这些属性都是特定于视图的.换句话说,这个对象不属于应用程序的商务逻辑(如果我理解这些概念,我还在学习).所以问题是,我应该在哪里包含这个对象的类?在MVVM的模型或辅助层中.
谢谢你的回答.