在我正在使用MVVM模式编写的WPF应用程序中,我有一个后台进程可以做到这一点,但需要从UI获取状态更新.
我正在使用MVVM模式,因此我的ViewModel几乎不知道向用户呈现模型的视图(UI).
假设我的ViewModel中有以下方法:
public void backgroundWorker_ReportProgress(object sender, ReportProgressArgs e)
{
this.Messages.Add(e.Message);
OnPropertyChanged("Messages");
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我有一个ListBox绑定到List<string>ViewModel 的Messages属性(a ). 通过调用a OnPropertyChanged来完成INotifyPropertyChanged接口的角色PropertyChangedEventHandler.
我需要确保OnPropertyChanged在UI线程上调用 - 我该怎么做?我尝试过以下方法:
public Dispatcher Dispatcher { get; set; }
public MyViewModel()
{
this.Dispatcher = Dispatcher.CurrentDispatcher;
}
Run Code Online (Sandbox Code Playgroud)
然后将以下内容添加到OnPropertyChanged方法中:
if (this.Dispatcher != Dispatcher.CurrentDispatcher)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(delegate
{
OnPropertyChanged(propertyName);
}));
return;
}
Run Code Online (Sandbox Code Playgroud)
但这没用.有任何想法吗?
我在WPF应用程序中使用MV-VM模式.我将ViewModel绑定到ContentControl并使用窗口资源中定义的数据模板来呈现该ViewModel的视图(UserControl).
在ViewModel中,我有一组项目.我将该集合绑定到WPF工具包中提供的数据网格.同样在视图模型中,我定义了一个RemoveItem命令,该命令接受要删除的项ID的参数.
如何在数据网格中绑定该命令?网格的数据上下文就是那个集合,所以类似于:
<Button Command="{Binding Path=RemoveCommand}" CommandParameter="{Binding Path=id}">X</Button>
Run Code Online (Sandbox Code Playgroud)
不起作用 - 它找不到命令.我想我需要做RelativeSource绑定,但那会是什么样子?Ancestor类型是UserControl还是ContentControl?我的ViewModel作为DataContext驻留在哪里?
还是我离开这里?
我想做一些像这样的事情:
let x = 5
let y = 10
let expr = Console.ReadLine()
expr
Run Code Online (Sandbox Code Playgroud)
可以"x+y"在控制台中输入以存储在expr中的位置.
如何在F#中评估这样的声明?
最终,我希望用户能够在网页上输入表达式或系统规则,并将它们保存在数据库中,以便在适当的时间在F#库中应用.我只是不知道如何将输入的字符串转换为F#中的函数值.
感谢您提供的任何帮助!
亚当
我想在WPF中使用一些3D控件,但有点惊讶地发现WPF中没有原始的实体控件 - 我只是想在一个场景中填充几个球体和立方体,但没有意识到我必须使用网格渲染它们.
当然有人已经创建了可以添加到WPF 3D场景的3d基元库.这些图书馆中有免费的吗?
建模工具怎么样?我知道有一些免费的建模应用程序(如Blender),但是有没有办法从这些应用程序导出模型并将它们包含在WPF应用程序中?
谢谢!
我正在尝试将Azure中的一些表存储从本地存储迁移到云.我一直在使用"devstoreaccount1"进行本地访问,但我不确定我需要在那里迁移到云端.
这不是我用来注册Azure帐户的用户帐户,不是吗?那只是我的电子邮件地址,而且似乎没有用.我也试过没有运气的项目名称.
门户中是否有任何列出此帐户名称的地方?
假设我有一个人类:
public class Person
{
public string Name {get; set;}
public int Age {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我想在Blend中创建一些示例数据,以帮助我直观地设计我的用户界面.我选择基于Blend中的类创建示例数据,但我得到的是一个样本Person - singular.我想创建一个Person的集合来绑定到列表框.我怎么告诉它这样做?我找不到它要求的任何地方.我是否必须创建一个Person集合的类.当然必须有办法做到这一点?
提前致谢.
我一定是个傻瓜,因为我在ASP.NET上的OpenID上看到的所有文章都让我对这个问题感到困惑.我很确定我理解这里涉及的概念,我对事情的后端方面看起来有点模糊.
因此,新用户访问我的网站并想要创建一个帐户.这里出现了大量问题:
我在这里错过了什么?我通常都非常聪明,但对于我的开发人员智能而言,这个区域对于超人来说就像是氪星石.提前致谢!
亚当
在视图模型中,我有一组名为"ClassA"的项目,称为"MyCollection".ClassA有一个名为"IsEnabled"的属性.
class MyViewModel
{
List<ClassA> MyCollection { get; set; }
class ClassA { public bool IsEnabled { get; set; } }
}
Run Code Online (Sandbox Code Playgroud)
我的视图有一个绑定到MyCollection的数据网格.每行都有一个按钮,其"IsEnabled"属性绑定到ClassA的IsEnabled属性.
当视图模型中的条件发生更改以使MyCollction列表中的某个特定项需要禁用时,我将IsEnabled属性设置为false:
MyCollection[2].IsEnabled = false;
Run Code Online (Sandbox Code Playgroud)
我现在想要通过OnPropertyChanged事件通知此更改的视图,但我不知道如何引用集合中的特定项目.
OnPropertyChanged("MyCollection");
OnPropertyChanged("MyCollection[2].IsEnabled");
Run Code Online (Sandbox Code Playgroud)
两者都不起作用.
如何通知查看此更改?谢谢!
您好
我得到了这个xaml,我的EventToCommand连接到MVVM,这个代码的问题是导航离开它的页面总是留在内存中.
<ComboBox Grid.Column="1" Grid.Row="0" FontSize="10"
SelectedIndex="{Binding Foo, Mode=TwoWay}" TabIndex="0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding FooChangeCommand}"
PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
<ComboBoxItem Content="Show Al" />
<ComboBoxItem Content="..." />
</ComboBox>
Run Code Online (Sandbox Code Playgroud) .net ×6
wpf ×4
mvvm ×3
c# ×2
3d ×1
asp.net ×1
azure ×1
data-binding ×1
f# ×1
graphics ×1
memory-leaks ×1
mvvm-light ×1
openid ×1
sample-data ×1