我已经玩了很长一段时间的WPF,但今天我第一次需要MultiBinding在另一个内部嵌套,类似于:
<MultiBinding>
<Binding />
<MultiBinding>
<Binding />
<Binding />
</MultiBinding>
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)
我得到一个异常,表明框架不允许它:
XamlParseException未处理:向类型'System.Collections.ObjectModel.Collection(System.Windows.Data.BindingBase)'的集合添加值引发异常.
InnerException更明确的是:
BindingCollection不支持MultiBinding类型的项.只允许绑定.
所以挖掘网络以获取更多信息,我偶然发现了这个Microsoft Connect问题,这正是我的问题所在.
感谢您的反馈.WPF今天不支持这一点.多年来一直要求使用此功能(最近一次是本月早些时候 - 请参阅https://connect.microsoft.com/WPF/feedback/details/650164/nested-multibinding).我们将继续考虑将来的版本.
现在我已经平静下来,我不会轻松.我仍然需要这个,我如何嵌套MultiBindings?
我不是WPF的新手,但我无法弄清楚这个问题:
我使用的ObservableCollection<MyCustomType>是我绑定到ComboBoxes,它像往常一样工作得很好,但在某些时候我需要更改集合的内容(我从数据库中检索一个新集合,可能包含也可能不包含旧集合的一部分) ).
现在添加或删除元素都是由WPF完成的,但是如果你改变了整个集合,我发现你必须为集合引发PropertyChanged.
问题是,有时崩溃会给我一个不太友好的例外.
我不确定究竟是什么触发了崩溃,但是如果我没有触摸View并从DB中检索新的集合,它就不会崩溃.
这是一些代码:
public const string MyObsCollectionProperty = "MyObsCollection";
private ObservableCollection<MyCustomType> m_MyObsCollection;
public ObservableCollection<MyCustomType> MyObsCollection
{
get { return m_MyObsCollection; }
set
{
m_MyObsCollection = value;
RaisePropertyChanged(MyObsCollectionProperty); // <-- Crashes here
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了例外: Unable to cast object of type 'MS.Internal.NamedObject' to type 'MyNameSpace.MyCustomType'
请注意,此异常来自Prism,但这可能只是因为我在ViewModel上继承了NotificationObject.
我感谢你对这个问题的任何帮助,
问候,
LK.
编辑:我认为问题来自ComboBox,更具体地说,来自我设置其属性的方式.
我将ItemsSource属性绑定到ObservableCollection,并决定选择哪个元素,我将SelectedValue绑定到ObservableCollection项的字段(ComboBox嵌套在ListView中).
我还设置了SelectedValuePath(你明白了).
我想当我改变第一个集合时,地狱破坏会在这个设置上失败.当我因为虚拟化而没有触摸视图时它会平静下来(它最初是隐藏的).
加成:
InnerException是nulll.
信息: Unable to cast object of type 'MS.Internal.NamedObject' to type 'CocoonV4.DAL.WcfServiceCocoonV4.DekoTemplate'.
at Microsoft.Practices.Prism.Commands.DelegateCommand`1.<>c__DisplayClass6.<.ctor>b__3(Object o)
at …Run Code Online (Sandbox Code Playgroud) 以下ruby代码在〜15秒内运行.它几乎不使用任何CPU /内存(约占一个CPU的25%):
def collatz(num)
num.even? ? num/2 : 3*num + 1
end
start_time = Time.now
max_chain_count = 0
max_starter_num = 0
(1..1000000).each do |i|
count = 0
current = i
current = collatz(current) and count += 1 until (current == 1)
max_chain_count = count and max_starter_num = i if (count > max_chain_count)
end
puts "Max starter num: #{max_starter_num} -> chain of #{max_chain_count} elements. Found in: #{Time.now - start_time}s"
Run Code Online (Sandbox Code Playgroud)
以下TPL C#将我的所有4个内核的使用率提高到100%,并且比ruby版本慢了几个数量级:
static void Euler14Test()
{
Stopwatch sw = new Stopwatch();
sw.Start(); …Run Code Online (Sandbox Code Playgroud) 我需要传递lambda查询作为参数,以下代码是示例,我很有兴趣为它找到一个工具,有样本:有些东西是这样的:
var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
var expr2 = TakeWhile((n, index) => n >= index));
Run Code Online (Sandbox Code Playgroud)
并使用它像这样:
public void UseLambda<T> (IEnumerable<T> source , lambda Expr){
var items= Expr.Compile(source);
foreach(var item in items)
Console.Writeline(item.ToString());
}
public void Main(){
List<int> numbers = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 };
var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => …Run Code Online (Sandbox Code Playgroud) 我已经在这里待了一个多小时没有成功,而且它正在努力.
我正在尝试制作一个匹配此字符串的正则表达式{Date HH:MM:ss},但这里的诀窍,HH,MM和ss是可选的,但它必须是"HH",而不仅仅是"H"(相同)事情适用于MM和ss).如果出现单个"H",则不应匹配该字符串.
我知道我可以使用H {2}来匹配HH,但我似乎无法使用该功能加上?匹配零次或一次(零,因为它是可选的,最多一次).
到目前为止我正在做这个(显然不起作用):
Regex dateRegex = new Regex(@"\{Date H{2}?:M{2}?:s{2}?\}");
Run Code Online (Sandbox Code Playgroud)
请帮助我,抱歉这个noob问题.
FB.
接下来的问题,既然我在第一个字符串上有匹配,我想只采用HH:MM:ss部分并将其放在另一个字符串中(这将是TimeStamp对象的格式).
我使用了相同的方法,如下所示:
Regex dateFormatRegex = new Regex(@"(HH)?:?(MM)?:?(ss)?");
Run Code Online (Sandbox Code Playgroud)
但是当我在"{Date HH:MM}"上尝试时,我没有匹配,为什么?
编辑:如果我添加这样的空间Regex dateFormatRegex = new Regex(@" (HH)?:?(MM)?:?(ss)?");我有结果,但我不想要空间......我认为第一个括号需要被转义,但(在这种情况下不会起作用,我猜因为它是不是作为要匹配的字符串的一部分的括号,而是一个关键字符.
我有以下代码:
public static IEngine CreateEngine()
{
UnityContainer container = Unity.LoadUnityContainer(DefaultStrategiesContainerName);
IEnumerable<IStrategy> strategies = container.ResolveAll<IStrategy>();
ITraderProvider provider = container.Resolve<ITraderProvider>();
return new Engine(provider, new List<IStrategy>(strategies));
}
Run Code Online (Sandbox Code Playgroud)
和配置:
<unity> <typeAliases>
<typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="weakRef" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="Strategy" type="ADTrader.Core.Contracts.IStrategy, ADTrader.Core" />
<typeAlias alias="Trader" type="ADTrader.Core.Contracts.ITraderProvider, ADTrader.Core" /> </typeAliases> <containers>
<container name="strategies">
<types>
<type type="Strategy" mapTo="ADTrader.Strategies.ThreeTurningStrategy, ADTrader.Strategies" name="1" />
<type type="Trader" mapTo="ADTrader.MbTradingProvider.MBTradingProvider, ADTrader.MbTradingProvider" />
</types>
</container> </containers></unity>
Run Code Online (Sandbox Code Playgroud)
我收到以下异常:
Microsoft.Practices.Unity.ResolutionFailedException:依赖项的解析失败,type ="ADTrader.Core.Contracts.ITraderProvider",name ="".异常消息是:当前构建操作(构建密钥构建密钥[ADTrader.MbTradingProvider.MBTradingProvider,null])失败:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.(策略类型BuildPlanStrategy,索引3)---> Microsoft.Practices.ObjectBuilder2.BuildFailedException:当前构建操作(构建密钥构建密钥[ADTrader.MbTradingProvider.MBTradingProvider,null])失败:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.(策略类型BuildPlanStrategy,索引3)---> System.AccessViolationException:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.在MBTCOMLib.MbtComMgrClass.EnableSplash(布尔bEnable)在ADTrader.MbTradingProvider.MBTradingProvider..ctor()在BuildUp_ADTrader.MbTradingProvider.MBTradingProvider(IBuilderContext)在Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext上下文)在Microsoft.Practices.ObjectBuilder2 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)中的.BuildPlanStrategy.PreBuildUp(IBuilderContext context)--- Microsoft的Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)的内部异常堆栈跟踪结束.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator定位器,
在Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型t,对象存在,字符串名称)中的Microsoft.Practices.Unity.UnityContainer.Resolve(类型t,字符串名称),位于ADTrader的Microsoft.Practices.Unity.UnityContainerBase.ResolveT. Engine.EngineFactory.CreateEngine()
任何的想法?
在我的 WPF 应用程序中,我有一个 ItemsControl,其项目值取决于上一个显示的项目。
ViewModel 是一个分割成可变长度部分的音频文件,我需要以这种方式显示它,右边显示一个 DateTime,这就是我需要计算的(我只知道每个部分的长度,我需要计算它开始和结束的实际时间,以及 ItemsControl 上的位置)。
--
----
------------
--
--------------------
Run Code Online (Sandbox Code Playgroud)
我的第一种方法是使用一个,ObservableCollection<MyviewModel>但很快就发生了一些恐怖事件:
5 路多重绑定,其中IMultiValueConverter我计算要返回的值并将 DataContext 的属性设置为该值,因为我只在运行时知道前一个元素。
前一个元素是使用 上的绑定发送的Relativesource.PreviousData。
现在我的问题是,在从 Converter 设置一个值(这显然是一件坏事)并实际让它工作后,常规 Collection 在其元素中没有顺序的概念,所以当更进一步时我想在其余部分中间添加一个音频部分,显示混乱。
此外,当我实现更多业务逻辑时,我可能需要访问在此转换器中计算的音频部分的开始和结束,如果还没有显示怎么办......?
所以这种方法在几个层面上都是错误的。
这就是我开始使用谷歌搜索并发现关于LinkedList. 现在我正在尝试创建一个基本上是 Observable LinkedList 的类(我不需要它是通用的):
public class ObservableSegmentLinkedList : LinkedList<MyViewModel>, INotifyCollectionChanged
{
//Overrides ???
#region INotifyCollectionChanged Members
public event NotifyCollectionChangedEventHandler CollectionChanged;
public void OnNotifyCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (CollectionChanged != null)
{
CollectionChanged(this, e);
}
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
问题的核心是我无法覆盖修改集合的方法(Addfirst、AddLast 等),所以我无法正确调用 OnNotifyCollectionChanged...
所以我想我可以为这些方法中的每一个做重载,但这听起来很讨厌......
简而言之:我需要某种集合,其中每个项目都知道前一个项目的详细信息,以便计算其自己的一个属性。 …
在我的应用程序中,我有一堆 ContextMenus,我希望它们都具有相同的外观,这是非常基本的,但它使用资源来设置 HighlightBrushKey 和 ControlBrushKey,它们是 SystemColors。它看起来像这样:
<ContextMenu Padding="0" Background="Transparent">
<ContextMenu.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent"/>
</ContextMenu.Resources>
<MenuItem Header="Delete"/>
<MenuItem Header="Modify"/>
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)
这里没有什么太奇特的,但我找不到一种方法来将它置于一种风格中,我想做的是:
<Style TargetType="ContextMenu">
<Setter Property="Padding" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Resources">
<Setter.Value>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
如何将资源融入风格中?(如果可能的话……)
谢谢!
嘿,我是vs2010的用户,但在我的全新安装中,功能/方法没有着色(标准黑色).这很愚蠢,但我已经习惯了,我想念那个小小的特色.我查看了字体和颜色选项,但我找不到需要更改的内容.
我真的不想安装视觉辅助.
任何线索?
晚上好,
我想知道是否可以做类似的事情:
while(true)
{
MyEnum currentValue = GetMyEnumValueFromDB();
if(currentValue == MyEnum.BreakIfYouGetThis)
break;
else if(currentValue == MyEnum.AlsoBreakIfYouGetThis)
break;
else
//Do some computing
}
Run Code Online (Sandbox Code Playgroud)
但是,除了要有一个while(true)循环外,我想将条件逻辑封装在Func中并像这样执行它:
while(new Func<bool>(/* what goes here? */))
{
//Do some computing
}
Run Code Online (Sandbox Code Playgroud)
至少就我而言,它看起来要干净得多,但是我不确定该怎么做(Func / Action ..的新功能)。
EDIT希望这可以澄清:
也可以这样进行:
while(GetMyEnumValueFromDB() != MyEnum.BreakIfYouGetThis &&
GetMyEnumValueFromDB() != MyEnum.AlsoBreakIfYouGetThis)
{
//Do some computing
}
Run Code Online (Sandbox Code Playgroud)
但这就是对数据库的两次调用...
谢谢=)