我有两个表:Transactions和TransactionAgents.TransactionAgents有一个名为TransactionID的Transactions的外键.很标准.
我也有这个代码:
BrokerManagerDataContext db = new BrokerManagerDataContext();
var transactions = from t in db.Transactions
where t.SellingPrice != 0
select t;
var taAgents = from ta in db.TransactionAgents
select ta;
foreach (var transaction in transactions)
{
foreach(var agent in taAgents)
{
agent.AgentCommission = ((transaction.CommissionPercent / 100) * (agent.CommissionPercent / 100) * transaction.SellingPrice) - agent.BrokerageSplit;
}
}
dataGridView1.DataSource = taAgents;
Run Code Online (Sandbox Code Playgroud)
基本上,TransactionAgent有一个名为AgentCommission的属性/列,对于我的数据库中的所有TransactionAgent,它都是null.
我的目标是执行您在foreach(var agent in taAgents)修补每个代理的值时所看到的数学运算,使其不为空.
奇怪的是,当我运行此代码和断点时,agent.AgentCommission = (formula)它显示正在为AgentCommissision计算值并且对象正在更新,但在我的数据网格中显示(仅用于测试)之后,它不显示它计算的值.
所以,对我而言,似乎该属性并未永久设置在该对象上.更重要的是,如果我通过更新将这个新更新的对象保留回数据库,我怀疑计算的AgentCommission将在那里设置.
如果没有以相同的方式设置我的表,是否有人可以查看代码并查看为什么我不保留该属性的值?
我在这个问题中创建并将引用的文件是:
TechnicainSelectionView.xaml
TechnicianSelectionView.cs
TechnicianSelectionViewModel.cs
Technician.cs (Code First Entity)
Run Code Online (Sandbox Code Playgroud)
我的TechnicanSelectionView.xaml中有以下xaml
<UserControl xmlns etc... here"
d:DesignHeight="48" d:DesignWidth="300">
<Grid>
<StackPanel>
<Label Content="Select a Technican to run the test" FontWeight="Bold"></Label>
<ComboBox ItemsSource="{Binding Technicians, Mode=TwoWay}"></ComboBox>
</StackPanel>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
ItemSource设置为绑定到的Technicians属性表示它 Cannot resolve Technicians due to an unknown DataContext.
因此,如果我们查看我的TechnicianSelectionView.cs代码隐藏...
public partial class TechnicianSelectionView : UserControl
{
public TechnicianSelectionViewModel ViewModel { get; private set; }
public TechnicianSelectionView()
{
InitializeComponent();
Technician.GenerateSeedData();
ViewModel = new TechnicianSelectionViewModel();
DataContext = ViewModel;
}
}
Run Code Online (Sandbox Code Playgroud)
...我们看到我正在将视图的DataContext设置为我的TechnicianSelectionViewModel ...
public class TechnicianSelectionViewModel : ViewModelBase
{ …Run Code Online (Sandbox Code Playgroud) 我有一个问题:
var transactions = from t in db.Transactions
where t.SellingPrice != 0
select new { t.CommissionPercent, t.SellingPrice };
Run Code Online (Sandbox Code Playgroud)
但实际上,我需要避免使用匿名类型,因为它只是readonly并选择我的"transaction"项目上的所有属性/列.
我本以为会是这样的:
var transactions = from t in db.Transactions
where t.SellingPrice != 0
select t.SellingPrice, t.CommissionPercent, t.Etc...
Run Code Online (Sandbox Code Playgroud)
要么...
var transactions = from t in db.Transactions
where t.SellingPrice != 0
select t.SellingPrice
select t.CommissionPercent
select t.Etc...
Run Code Online (Sandbox Code Playgroud)
有没有办法检索对象对属性的所有内容并将其传递给Ienumerable?
我正在学习实体框架并在MVVM应用程序中使用它,其中每个ViewModel都使用DbContext进行数据访问.免责声明:在实际应用程序中,我知道ViewModel不应直接与数据访问层交互.
鉴于每个ViewModel都是通过维护与模型本身的关系来监视和操纵View的状态,我开始怀疑旋转多个DbContext对象的含义,并且如果像DBContext这样的东西最好留作单例 - 我很快找到了答案是" 不 ".因此,如果共识是每个用户都有一个实例(如多个ViewModel的情况,或者你有什么),我仍然没有看到任何人提到这个问题的潜在问题.
详细说来,假设我有两个ViewModel,每个我创建一个Context(TestContext继承自DbContext)来维护每个ViewModel生命周期中的数据访问活动:
public class MainWindowViewModel : ViewModelBase
{
private TestContext db = new TestContext();
... other code follows (properties methods etc...)...
}
public class TestViewModel: ViewModelBase
{
private TestContext db = new TestContext();
... other code follows (properties methods etc...)...
}
Run Code Online (Sandbox Code Playgroud)
每个班级都有一个可以消费它的背景,是否有任何陷阱?
嘲讽我的一个想法是,是否有可能让任何一个上下文与另一个上下文不同步,这样一个ViewModel通过其上下文更加"最新"而具有比另一个更新的数据.我有兴趣知道这样的事情.
谢谢.
我不希望发现/涵盖所有情况,因为这对于编码的情况是独特的.我只是想知道是否有任何"前期"或明显的危险,我不知道自己是这个主题的新手.
鉴于此代码......
public class CalibrationViewModel : ViewModelBase
{
private FileSystemWatcher fsw;
public CalibrationViewModel(Calibration calibration)
{
fsw = new FileSystemWatcher
{
Path = @"C:\Users\user\Desktop\Path\ToFile\Test_1234.txt",
Filter = @"Test_1234.txt",
NotifyFilter = NotifyFilters.LastWrite
};
fsw.Changed += (o, e) =>
{
var lastLine = File.ReadAllLines(e.FullPath).Last();
Dispatcher.BeginInvoke((Action<string>) WriteLineToSamplesCollection, lastLine); //line that cites error
};
}
private void WriteLineToSamplesCollection(string line)
{
// do some work
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我收到错误,'无法在静态上下文中访问非静态方法BeginInvoke'?
我已经看过SE上的其他几个例子,大多数人试图在创建对象之前尝试使用一个字段,好像他们试图以静态方式使用非静态字段,但我不明白它是什么关于我的调用相同错误的代码.
最后,我该怎么做才能修复这个特定的问题/代码?
更新:修正标题以反映"方法"而非"财产"的问题.我还补充说,该类实现了ViewModelBase.
我有一个客户端发送一个xml feed我使用以下代码解析.这段代码有效.
reviews = from item in xmlDoc.Descendants("node")
select new ForewordReview()
{
PubDate = (string)item.Element("created"),
Isbn = (string)item.Element("isbn"),
Summary = (string)item.Element("review")
};
Run Code Online (Sandbox Code Playgroud)
获得所有"评论"后,我将IEnumerable转换为List并将其返回.最初,我有一个很好的,很容易解析他们的XML,这看起来像这样:
<reviews>
<node>
<created>01-01-1900</created>
<ISBN>12345657890123</ISBN>
<Review>This is a nice and silly book</Review>
</node>
<node>
<created>01-01-2011</created>
<ISBN>1236245234554</ISBN>
<Review>This is a stupid book</Review>
</node>
<node>
<created>12-06-1942</created>
<ISBN>1234543234577</ISBN>
<Review>This is a old, naughty book</Review>
</node>
</reviews>
Run Code Online (Sandbox Code Playgroud)
然而,他们已经改变了我们无法访问的模式,现在他们的XML在最终<node>标签中添加了一个不包含我正在寻找的死神元素的结尾,所以,我的解析就打破了这最后一个标签,我抛出一个异常.这是一个例子:
<reviews>
<node>
<created>01-01-1900</created>
<ISBN>12345657890123</ISBN>
<Review>This is a nice and silly book</Review>
</node>
<node>
<created>01-01-2011</created>
<ISBN>1236245234554</ISBN>
<Review>This is a stupid book</Review>
</node>
<node> …Run Code Online (Sandbox Code Playgroud) 介绍
我有一个应用程序,可以在运行时导入实验室仪器数据.导入此数据,然后ListView按照最终用户根据其测试要求以一定间隔显示.当ListView他们观察到感兴趣的值时,他们会按下"开始"按钮,应用程序开始对该数据和后续数据执行计算,直到按下"停止"按钮.因此,在屏幕的左侧是用于显示导入数据的视图,在右侧是用于在计算和显示值时观察值和统计数据的另一个视图.
现行守则
显示导入数据的ListView的视图是ImportProcessView.xaml,它将其设置DataContext为ImportProcessViewModel.cs.我刚刚介绍的VM有一个属性ObservableCollection<IrData>,ListView,我刚刚描述,绑定到.现在到有趣的部分......
所述ImportProcessView具有ContentControl其设定它的内容动态地表示特定于由最终用户选择的相的类型的控件和字段一个用户控件.
<StackPanel Background="White" Margin="5">
<ContentControl Content="{Binding CurrentPhaseView}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
有三个PhaseViews,每个都在自己的用户控件中,每个都设置DataContext为ImportProcessViewModel.结果我得到了一些严重的VM膨胀到2000行.荒谬.我知道.膨胀的原因是因为ImporProcessViewModel通过三个PhaseView中的每一个的属性维护状态,而不仅仅是那个,但包含用于执行其数据存储和显示在这些"PhaseViews"中的计算的方法.
我想要实现的目标
显然,在ImportProcessViewModel变得更加笨拙之前,我需要将其分解,以便每个PhaseView都有自己的ViewModel,但是为了ObservableCollection强加的依赖性,每个ViewModel都会保持与ImportProcessViewModel的关系IrData.
R&d
我已经完成了对ViewModels相互通信的研究,但大多数结果都涉及使用特定MVVM框架编写的应用程序.我没有使用框架,在项目的这一点上,重构它以开始使用框架为时已晚.
然而,我确实找到了这篇文章,'hbarck'提供的答案提示了一些像构图一样简单的东西来实现我想要的结果,但由于我对DataTemplates没有太多经验,所以我不明白他/他的意思是什么她建议将"UserControl的ViewModel"暴露为主ViewModel上的属性,并将ContentControl绑定到此属性,然后通过DataTemplate实例化View(即UserControl)"
具体地讲,我不明白什么叫"绑定ContentControl中给此属性,这将通过一个DataTemplate实例化视图 ".
有人可以通过代码示例澄清在此示例的上下文中通过DataTemplate实例化视图的含义吗?
另外,这是一个好方法(正如'hbarck'所建议的那样)?
可以看出,我已经将ContentControl的Content属性设置为要实例化的Phase View.我只是不知道DataTemplate会是什么样子.
是否有一种方法可以使用Linq to XML来隔离和检索编码声明的属性?
<?xml version="1.0" encoding="UTF-8" ?>
Run Code Online (Sandbox Code Playgroud)
好像你可以initalize XDOC一个或者用的XElement整个文档或只是一个开始元素,但如何将你隔离这个标记......它没有名字......至少我不知道如果这样做.
我有一个视图 DisplayTestsView.cs 并且在那个视图中我有
<ListView ItemsSource="{Binding SelectedTechnician.Tests}"
SelectedItem="{Binding SelectedTest}" x:Name="AvailableTestsListView" Height="140">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" Width="auto" DisplayMemberBinding="{Binding Id}"/>
<GridViewColumn Header="Test" Width="auto" DisplayMemberBinding="{Binding TestTypeName}"/>
<GridViewColumn Header="Status" Width="auto" DisplayMemberBinding="{Binding StutusTypeName}"/>
</GridView>
</ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud)
我希望 StatusTypeName 单元格文本的 TextColor 是基于条件的某种颜色。例如,如果 StatusTypeName 等于“Incomplete”,那么我希望单元格中的文本变为红色。
从视图中可以看到的测试(实体)列表是 SelectedTechnician.Tests,而 SelectedTechnician 是我的 ViewModel (DisplayTestsViewModel.Tests) 上的一个属性。
我想一个人必须使用 GridViewColumn 上的 CellTemplate 属性,但对如何有条件地操作模板(一般)知之甚少,我不确定从哪里开始。
即使 CellTemplate 与它无关,我如何有条件地设置 GridViewColumn 单元格的文本以根据上述类似的条件更改颜色?
鉴于我的代码的上下文片段:
var calibration = new Calibration
{
CalibrationType = SelectedTest.TestTypeId
,Expiration = expirationDate
,LastSaved = DateTime.Now
,StatusTypeId = 1
,TechnicianId = SelectedTechnician.Id
,Phases = BuildCalibrationPhases()
};
db.Calibrations.Add(calibration);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
实体框架有没有办法在db.SaveChanges();完成后获取为校准对象选择(种子)的主键?
换句话说,如何在提交后获取此对象的主键?