小编Lou*_*ann的帖子

嵌套MultiBinding(s)

我已经玩了很长一段时间的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

c# wpf multibinding

18
推荐指数
5
解决办法
6578
查看次数

无法将"MS.Internal.NamedObject"类型的对象强制转换为自定义类型

我不是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)

wpf casting prism observablecollection

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

为什么Ruby中的这个算法运行得比Parallel'd C#快?

以下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)

c# ruby algorithm performance task-parallel-library

15
推荐指数
2
解决办法
534
查看次数

有没有办法将lambda表达式作为变量或参数传递?

我需要传递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)

.net c# linq lambda

14
推荐指数
2
解决办法
2455
查看次数

正则表达式匹配零或一次字符串

我已经在这里待了一个多小时没有成功,而且它正在努力.

我正在尝试制作一个匹配此字符串的正则表达式{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)?");我有结果,但我不想要空间......我认为第一个括号需要被转义,但(在这种情况下不会起作用,我猜因为它是不是作为要匹配的字符串的一部分的括号,而是一个关键字符.

c# regex

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

Unity.ResolutionFailedException - 依赖项的解析失败

我有以下代码:

 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()

任何的想法?

c# unity-container

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

可观察链表

在我的 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...

所以我想我可以为这些方法中的每一个做重载,但这听起来很讨厌......

简而言之:我需要某种集合,其中每个项目都知道前一个项目的详细信息,以便计算其自己的一个属性。 …

wpf linked-list inotifycollectionchanged

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

以隐式样式设置 SystemColors 覆盖

在我的应用程序中,我有一堆 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)

如何将资源融入风格中?(如果可能的话……)

谢谢!

wpf resources xaml styles

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

Vs2010字体颜色

嘿,我是vs2010的用户,但在我的全新安装中,功能/方法没有着色(标准黑色).这很愚蠢,但我已经习惯了,我想念那个小小的特色.我查看了字体和颜色选项,但我找不到需要更改的内容.

我真的不想安装视觉辅助.

任何线索?

fonts colors visual-studio-2010

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

是否有可能将Func &lt;bool&gt;作为条件

晚上好,

我想知道是否可以做类似的事情:

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)

但这就是对数据库的两次调用...

谢谢=)

c# lambda loops

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