我有一个PriorityBinding
<PriorityBinding FallbackValue="Bindings were null">
<Binding Path="Foo" />
<Binding Path="Bar" />
</PriorityBinding>
Run Code Online (Sandbox Code Playgroud)
我想这样做,如果Foo为null,它将使用Bar,如果两者都为null,它将使用FallbackValue.但是null是此属性的有效值,因为它只需要一个对象.
当值为null时,有没有办法让PriorityBinding前进到下一个绑定?我宁愿在XAML中这样做,但如果我不能,我只会为它做一个转换器.
编辑
我最后只为它写了一个转换器
public class NullToDependencyPropertyUnsetConverter
: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value ?? DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud) 抽象术语的问题:
我有一个有向无环图(DAG),它包含查询时排他的顶点子集(查询结果中每个子集只有一个项目).当我查询图形结构时,我想获得从给定顶点流出的顶点集合,同时仅从图形中已知顶点子集中选择单个项目.
具体问题:
我有一个存储我的程序集(顶点)及其依赖项(边)的DAG.给定一个程序集或一组程序集,我需要查询以获取所有涉及的程序集及其依赖项的集合.困难的部分是每个程序集都有多个版本,并且只能将一个程序集的一个实例加载到一个进程中.给定程序集的依赖关系在程序集的各个版本之间发生更改.
这个问题或一组问题是否有名称?我可以研究一种标准算法来寻找解决方案吗?
可能的解决方案:
一个传递闭包似乎接近一个很好的解决方案,但是从子集(集版本)选择的项目将根据通过该图拍摄,可能通过多个分支的路径改变,所以你就几乎需要跟踪通过图形的路径生成传递闭包.
一个图形数据库也许能帮忙不少,但我们要避免走这路现在除非绝对需要.
algorithm graph-theory dependency-management directed-acyclic-graphs
我想分配一个我已经有第二个名称的资源,类似于使用 Styles 的 BasedOn 属性。具体来说,我有一个画笔,用于一组名为 ForegroundColor 的元素,我想在控件模板(组合框)中使用它,并将其称为 MouseOverBackgroundBrush。我想做这样的事情:
<ResourceCopy x:key="MouseOverBackgroundBrush" Value="{StaticResource ForegroundColor}" />
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者有更好的方法在 Xaml 中做到这一点?
我正在使用WPF工具包的Calendar控件来允许用户选择日期.如果尚未选择日期,则SelectedDate绑定的属性为Null.这使日历默认为1月1日,AD.我想做点什么
SelectedDate="{Binding UserPickedDate, TargetNullValue=Today, Mode=TwoWay}"
Run Code Online (Sandbox Code Playgroud)
但是"今天"和"现在"都会引发绑定错误.我可以使用TargetNullValue将默认日期设置为今天或现在吗?
这是解释我的问题的基本示例.让我说我有
ObservableCollection<int> Numbers {get; set;}
Run Code Online (Sandbox Code Playgroud)
和一个返回Numbers之和的IValueConverter.
通常我要做的是将IValueConverter更改为IMultiValueConverter并将第二个值绑定到Numbers.Count,就像这样
<MultiBinding Converter="{StaticResource SumTheIntegersConverter}">
<Binding Path="Numbers" />
<Binding Path="Numbers.Count" />
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)
但是我无法使用此方法来解决我的实际问题.似乎应该有一个更好的方法来更新绑定,当集合发生变化,我只是没想到.在将项目添加到Numbers并将其删除时,将值转换器运行的最佳方法是什么?
我已经阅读了Evolving the Reflection API博客文章,并且当我在PCL中包含"旧"API时,我已经转换了大部分代码,但我无法找到IsInstanceOfType或等同于Type或TypeInfo.它是非常常用的,所以我怀疑它是在新的API下完全丢弃所以我打赌功能刚刚被重命名或折叠在一起其他功能,我只是没有看到它.
c# system.reflection base-class-library portable-class-library
我想使用网格作为 ItemsHost,但没有任何项目出现在其绑定(列、行)位置。我怎样才能做到这一点?举个简单的例子:
XAML
<ItemsControl ItemsSource="{Binding DataSet}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Grid.Column="{Binding Col}" Grid.Row="{Binding Row}" Text="{Binding Text}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Style>
<Style TargetType="{x:Type ItemsControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ItemsControl}">
<Grid HorizontalAlignment="Stretch" IsItemsHost="True">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ItemsControl.Style>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
代码隐藏
Class Window1
Private myTestData As TestData
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
myTestData …Run Code Online (Sandbox Code Playgroud) 我正在写一些单元测试,我有很多表单的功能
public void SomeTestHelperMethod<TKey, TValue>(TKey key, TValue value)
Run Code Online (Sandbox Code Playgroud)
我正在反复调用这样的各种论点
SomeTestHelperMethod<int, int>(0, 1);
SomeTestHelperMethod<int, object>(1, new Nullable<double>(16.5));
SomeTestHelperMethod<int, string>(2, "The quick brown fox jumped over the lazy dog.");
SomeTestHelperMethod<object, int>(new NullReferenceException(), 15);
SomeTestHelperMethod<object, object>(StringComparison.Ordinal, new Version());
SomeTestHelperMethod<object, string>((ushort)3, string.Empty);
SomeTestHelperMethod<string, int>(string.Empty, 195);
SomeTestHelperMethod<string, object>("A string", this);
SomeTestHelperMethod<string, string>("Another string", "Another string");
Run Code Online (Sandbox Code Playgroud)
我想做的是编写一个带有Action委托的函数,并可以使用所有不同的参数调用委托.有什么办法吗?
回答:
感谢MichaelCG,这就是我最终做的事情:
private void CallWithKeyAndValue(string methodName)
{
MethodInfo method = typeof(ObservableDictionaryTest).GetMethod(methodName);
foreach (KeyValuePair<object, object> kvp in ourKeyValueSet)
{
MethodInfo genericMethod = method.MakeGenericMethod(kvp.Key.GetType(), kvp.Value.GetType());
genericMethod.Invoke(this, new[] { kvp.Key, kvp.Value }); …Run Code Online (Sandbox Code Playgroud) 我有一个Action,它接受一个回调,一旦它完成就会调用泛型参数,即一个Action<Action<T>>.我想在操作开始时显示一个忙碌的微调器,然后在调用回调时将其取出,所以我创建了一个简单的实用程序来执行此操作.我遇到的问题是用户希望他们的回调在原始调用线程上运行,但并不总是如此.它几乎总是在单元测试(nUnit)中完美地工作,但在应用程序实际运行时不适用于某些调用(WPF,.Net 4).
以下是我所拥有的相关内容
void WrapAsyncCallbackPattern<T>(Action<T> callback, Action<Action<T>> actionToRun)
{
var subject = new AsyncSubject<T>();
try
{
actionToRun(
result =>
{
subject.OnNext(result);
subject.OnCompleted();
});
}
catch (Exception ex)
{
subject.OnError(ex);
}
subject
.ObserveOn(Scheduler.CurrentThread)
.Subscribe(callback, OnError);
}
Run Code Online (Sandbox Code Playgroud)
我想callback在我正在订阅的线程上运行(并且subject已声明)但它似乎没有可靠地执行.我认为我做的事情很傻.它是什么?
编辑:添加了单元测试代码
private readonly TimeSpan m_WaitTime = TimeSpan.FromSeconds(1);
[Test]
public void WrapAsyncCallbackPattern_WithActionOnDifferentThread_CallsCallbackOnSameThread()
{
var awaiter = new AutoResetEvent(false);
bool callbackRan = false;
int callingThreadId = Thread.CurrentThread.ManagedThreadId;
int callbackThreadId = int.MinValue;
int actionThreadId = int.MinValue;
BackgroundOperation.WrapAsyncCallbackPattern<int>(
_ =>
{
callbackRan …Run Code Online (Sandbox Code Playgroud) 我有一个自定义控件Workspace,它继承Control和在其中是一个DependencyProperty我需要包含用户指定IEnumerable<IFoo>(我也尝试使其非通用IEnumerable).
Public Shared ReadOnly FoosProperty As DependencyProperty = DependencyProperty.Register("Foos", GetType(IEnumerable(Of IFoo)), GetType(Workspace), New FrameworkPropertyMetadata())
Public Property Foos() As IEnumerable(Of IFoo)
Get
Return CType(Me.GetValue(FoosProperty), IEnumerable(Of IFoo))
End Get
Set(ByVal value As IEnumerable(Of IFoo))
Me.SetValue(FoosProperty, CType(value, IEnumerable(Of IFoo)))
End Set
End Property
Run Code Online (Sandbox Code Playgroud)
当我创建并设置一个IFoo代码数组时,一切都很完美,但是当我尝试在XAML中添加它们时,我得到了错误.如果我添加一个IFoo我得到错误
在运行时.如果我尝试添加多个IFoo项目,我会在编译时遇到三个错误
我读错误意味着WPF没有像往常那样将xaml转换为项目数组.以下是我尝试在XAML中添加项目的方法
<Workspace>
<Workspace.Foos>
<FooItem />
<FooItem />
</Workspace.Foos>
</Workspace>
Run Code Online (Sandbox Code Playgroud)
我在过去创建了类似的DependencyProperties,从来没有遇到过问题所以我猜我错过了一些简单的东西.
谢谢你的帮助!
wpf ×6
xaml ×3
.net ×1
algorithm ×1
c# ×1
c#-4.0 ×1
calendar ×1
data-binding ×1
delegates ×1
graph-theory ×1
grid ×1
ienumerable ×1
lambda ×1
resources ×1
wpftoolkit ×1