小编Nuc*_*mer的帖子

从嵌套的ItemsControls中指定完整绑定路径

当最外层控件的DataContext发生更改时,我遇到了使用ItemSources的嵌套控件的问题.内部控件似乎更新以反映新的DataContext,但它有一些"Ghost"绑定仍然绑定到旧的DataContext.

我怀疑拥有DataTemplates的嵌套控件会阻止内部控件的绑定在外部控件的DataContext更改时更新.我在某处读到只有绑定才响应从PATH中明确定义的对象引发的PropertyChanged事件.

我的问题是:如何使用ItemsSources从nexted控件中完全定义绑定PATH?就我而言:

<DataGrid name="OuterGrid" ItemsSource={Binding SelectedSchool.Classes}"> 
   <ItemsControl ItemsSource={Binding Students}">
      <ComboBox SelectedItem={Binding Grade}" />
   </ItemsControl>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

我想完全指定内部ComboBox的SeletedItem PATH,类似于以下内容,但是我需要将它绑定到集合中的特定项(而不仅仅是索引0处的那个).

<ComboBox SelectedItem="{Binding ElementName=OuterGrid, 
     Path=DataContext.SelectedSchool.Classes[0].Students[0].Grade}" />
Run Code Online (Sandbox Code Playgroud)

我在下面有一个更详细的问题示例,我无法发布实际代码或描述我正在使用的ACTUAL对象(安全原因),所以我试图用最简单的方式来理解它.


模型:

我有一个相当复杂的Biz对象,其中包含其他对象的集合.集合中的项目也包含集合.

  • 学校有很多课程
  • 课程有很多学生
  • 每个学生都有一个班级的字母等级.
  • 每所学校的可能的字母等级列表是不同的.

每个类(包括我的ViewModel)都实现了INotifyPropertyChanged,每个集合都是一个ObservableCollection.


视图模型:

我的ViewModel具有以下特性:

  • 一个ObservableCollection of Schools ...(AllSchools).
  • 选定的学校
  • 布尔值(IsEditing)
  • ObservableCollection可能的等级(当IsEditing发生变化时会更新,并且基于所选择的学校).

这里要注意的重要一点是,不同的学校可能有不同的可能成绩(即一个可能有A +,A和A-而另一个只有A).


XAML:

我有一个Datagrid绑定到我的ViewModel的AllSchools集合和ViewModel的SelectedSchool属性.当用户双击一行时,事件处理程序通过更改ViewModel的IsEditing属性(编辑面板的Visibily绑定到IsEditing属性)打开所选学校的"编辑面板".在编辑面板中,我有一个Datagrid(绑定到所选学校的Classes集合),在Datagrid内部我有一个带有ItemsControlTemplatedColumn(绑定到当前Class的学生的集合).每个学生都有一个ComboBox,用于学生在课堂上的成绩.ComboBox的ItemsSource是ViewModel的PossibleGrades集合.


问题:

问题在于,当SelectedSchool发生变化时,之前在SelectedSchool中的任何学生,其字母成绩不适用于新选择的学校,突然将其成绩设置为null(因为ComboBox的ItemsSource不再具有成绩) .

在视觉上,一切似乎都很好.编辑面板正确显示所选学校的属性,并在SelectedSchool属性更改时更新.但是如果我重新打开第一所学校的编辑面板,那么组合框中没有一个选择了值,因为当我选择第二所学校时它们都被设置为null.

它就像旧的ComboBoxes仍然有他们的Bindings连接,即使他们不再出现在屏幕上.但是,如果只影响以前的SelectedSchool(不是之前的那个).

wpf xaml binding datagrid mvvm

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

下载用于离线开发/发布的 Nuget 包

简短的问题

有没有一种方法可以以编程方式下载构建/发布解决方案所需的所有 Nuget 包并将它们输出到可以移动到本地 Nuget 存储库的单个目录中?

一些背景

在我工作的地方,大多数开发都是在气隙网络(没有互联网)上完成的。在最近的一个项目中,我能够在我们的支持互联网的网络上进行开发。这恰好是第一个在支持 Internet 的网络上开发的应用程序,也是我们开发的第一个 ASP.NET Core 应用程序。该解决方案可以在面向互联网的网络上正常构建、运行和发布。我现在正在尝试将解决方案移至气隙网络,但在移走所有依赖项时遇到问题。

起初,由于缺少 ASP.NET Core nuget 包,该解决方案无法构建;因此,我将用于开发应用程序的计算机上的本地缓存中的所有 nuget 包复制到气隙网络上的本地 Nuget 存储库。现在应用程序已构建,但我似乎无法发布Web 项目(ASP.NET Core)。我收到了 25 个以上的错误:

  • 无法找到包runtime.any.System.Diagnositics.Tools。源中不存在具有此 id 的包...
  • 无法找到版本 (>= 2.1.6) 的 Nicrosoft.NETCore.App...
  • 无法找到...

当我尝试从 Visual Studio(使用 IIS Express)运行时,我还收到运行时错误“无法显示此页面”,但我不确定这是否是相关问题。单元/集成测试运行良好。

我可以尝试从 Nuget.org手动下载每个 nuget 包并将它们移动到气隙网络,但需要几个小时才能将内容从一个网络移动到另一个网络。无论如何,我是否可以自动检索构建/发布解决方案所需的所有 nuget 包,以便我可以从一个网络到另一个网络进行单次传输,而不是移动我拥有的内容并等待查看发生了什么问题?最好我想要一个 exe 或 PowerShell 脚本,它可以查看 sln 文件并将所有必要的 nuget 包放入指定的目录中。

nuget asp.net-core .net-standard

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

使用 HttpClient 将大文件分块上传到 Controller,IFormFile 始终为空

我正在尝试创建一个 .Net 标准“客户端”类,用于将(有时非常大)文件上传到控制器。我想通过将文件分成块并一次上传一个来做到这一点。目的是让其他应用程序使用它而不是直接与 Web Api 通信。

我已经让控制器工作了。我已经验证它可以使用支持块保存的 Kendo-ui 控件工作。

我遇到的问题是,IEnumerable<IFormFile> files从我的客户端类发布时,我的控制器的参数始终为空

控制器

[Route("api/Upload")]
public ActionResult ChunkSave(IEnumerable<IFormFile> files, string metaData, Guid id)
{
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(metaData));
    var serializer = new DataContractJsonSerializer(typeof(ChunkMetaData));
    ChunkMetaData somemetaData = serializer.ReadObject(ms) as ChunkMetaData;

    // The Name of the Upload component is "files"
    if (files != null)
    {
        // If this is the first chunk, try to delete the file so that we don't accidently
        // and up appending new bytes to the old …
Run Code Online (Sandbox Code Playgroud)

c# file-io dotnet-httpclient asp.net-core-mvc

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

通过接口获取DbContext设置<T>

背景

我有一个多层应用程序,我试图重构.我的数据层本质上只是一个EF数据库上下文(及其所有实体).我想要实现的目标之一是删除我的Biz层和我的数据层之间的依赖关系(使用依赖注入),以便我的单元测试不必命中数据库.为此,我创建了一个我的上下文实现的简单接口IDataStore.

public interface IDataStore
{
   void Insert<T>(T entity) where T:class;
   void Update<T>(T entity) where T:class;
   void Delete<T>(T entity) where T:class;
   T GetById<T>(int id) where T:class;
   IQueryable<T> All<T>() where T:class;
}

public partial class MyContext:DbContext,IDataStore
{
   public void Insert<T>(T entity) where T:class{
      this.Set<T>().Add(entity);
      this.SaveChanges();
   }
   ...
   public IQueryable<T> All<T>() where T:class{
      return this.Set<T>();
   }
}
Run Code Online (Sandbox Code Playgroud)

使用IoC contianer,我能够将我的Biz层中的所有引用删除到MyContext(而不是引用IDataStore),但我仍然卡在引用我的特定实体类.在下面的例子中,我使用的是IDataStore,但我也使用了Data.Color(我的一个实体类).

public static void MyBizMethod(){
   ...
   IDataStore store = myUnityContainer.Resolve<IDataStore>();
   List<string> colorNames = store.All<Data.Color>().Select(c => c.name).ToList();
   ...
}
Run Code Online (Sandbox Code Playgroud)

我接下来要做的是创建一个IColor接口并使用一个分部类来使Data.Color实现IColor.然后,我修改了我的Biz层逻辑,调用DataStore.All <IColor>()而不是DataStore.All <Data.Color>();

public interface IColor{ …
Run Code Online (Sandbox Code Playgroud)

c# generics entity-framework dependency-injection

2
推荐指数
1
解决办法
3144
查看次数

使用 Async/Await 的无限递归调用永远不会抛出异常

我正在编写一个小型控制台应用程序,以尝试熟悉使用 async/await。在这个应用程序中,我不小心创建了一个无限递归循环(我现在已经修复了)。不过,这个无限递归循环的行为让我感到惊讶。它没有抛出StackOverflowException,而是陷入僵局。

考虑以下示例。如果Foo()使用runAsyncset to调用false,它会抛出一个StackOverflowException。但是当runAsyncis 时true,它会陷入僵局(或至少看起来会)。谁能解释为什么行为如此不同?

bool runAsync;
void Foo()
{
    Task.WaitAll(Bar(),Bar());
}

async Task Bar()
{
   if (runAsync)
      await Task.Run(Foo).ConfigureAwait(false);
   else
      Foo();
}
Run Code Online (Sandbox Code Playgroud)

.net c# recursion task-parallel-library async-await

2
推荐指数
1
解决办法
356
查看次数