我有一个看起来像这样的多绑定:
<UserControl.Visibility>
<MultiBinding Converter="{StaticResource isMouseOverToVisibiltyConverter}">
<Binding ElementName="otherElement" Path="IsMouseOver" />
<Binding RelativeSource="{RelativeSource Self}" Path="IsMouseOver" />
</MultiBinding>
</UserControl.Visibility>
Run Code Online (Sandbox Code Playgroud)
而且,我希望能够在两个绑定的IsMouseOver之间添加一个延迟,并将Visibility设置为Collapsed.
我找到了这个DelayBinding实现:http: //www.paulstovell.com/wpf-delaybinding
但是,这对MultiBinding不起作用,而且我一直无法弄清楚如何使用MultiBinding.
我可以选择在代码隐藏中的事件中对Visibility进行更改,这样可以工作,但是如果通过绑定系统有某种方法可以做到这一点会很好.
有没有办法为MultiBinding添加延迟?
编辑:雷,为了让你的类编译和运行,我不得不做一些修复.但是,由于更新没有传播,因此仍然存在问题.它似乎只更新一次目标属性.
[ContentProperty("Bindings")]
public class DelayedMultiBindingExtension : MarkupExtension, IMultiValueConverter, INotifyPropertyChanged
{
public Collection<BindingBase> Bindings { get; private set; }
public IMultiValueConverter Converter { get; set; }
public object ConverterParameter { get; set; }
public CultureInfo ConverterCulture { get; set; }
public BindingMode Mode { get; set; }
public UpdateSourceTrigger UpdateSourceTrigger { get; set; }
public object CurrentValue …Run Code Online (Sandbox Code Playgroud) 我只是尝试将两个控件绑定为命令参数,并将它们作为一个传递给我的命令object[].
XAML:
<UserControl.Resources>
<C:MultiValueConverter x:Key="MultiParamConverter"></C:MultiValueConverter>
</UserControl.Resources>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Button Name="Expander" Content="+" Width="25" Margin="4,0,4,0" Command="{Binding ExpanderCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MultiParamConverter}">
<Binding ElementName="Content"/>
<Binding ElementName="Expander"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
<Label FontWeight="Bold">GENERAL INFORMATION</Label>
</StackPanel>
<StackPanel Name="Content" Orientation="Vertical" Visibility="Collapsed">
<Label>Test</Label>
</StackPanel>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
命令:
public ICommand ExpanderCommand
{
get
{
return new RelayCommand(delegate(object param)
{
var args = (object[])param;
var content = (UIElement)args[0];
var button = (Button)args[1];
content.Visibility = (content.Visibility == Visibility.Visible) ? Visibility.Collapsed : Visibility.Visible;
button.Content = (content.Visibility == Visibility.Visible) ? …Run Code Online (Sandbox Code Playgroud) 我想在文本块中创建一个带有多绑定的工具提示,但无论我尝试它都不起作用.
这是我到目前为止所尝试的:
<TextBlock Text="{Binding Description, StringFormat='Description : {0}{}'}">
<ToolTipService.ToolTip>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="Description : {0}{1}{}">
<Binding Path="FirstDescription" />
<Binding Path="SecondDescription" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</ToolTipService.ToolTip>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试它时,我在工具提示上看到的是:System.Windows.Controls.TextBlock.
当我尝试没有tooltipservice,只有工具提示,像这样:
<TextBlock Text="{Binding Description, StringFormat='Description : {0}{}'}">
<ToolTip>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="Description : {0}{1}{}">
<Binding Path="FirstDescription" />
<Binding Path="SecondDescription" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</ToolTip>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
屏幕刚刚卡住了.
我有这个标记:
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<SolidColorBrush x:Name="Border">
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
</GroupBox.BorderBrush>
Run Code Online (Sandbox Code Playgroud)
在后面的代码中我在window_loaded方法中有这一行:
DataContext = uiManager;
Run Code Online (Sandbox Code Playgroud)
uiManager是UIManager类型,它有两个名为IsConnected和IsLoggedIn的公共属性.
此代码在启动时失败,因为Multibinding调用的Converter中的values数组未填充布尔值,但值为DependencyProperty.UnsetValue.
当我使用下面的标记(并更改转换器的返回类型)时,它确实有效.
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</GroupBox.BorderBrush>
Run Code Online (Sandbox Code Playgroud)
在第一个示例中,似乎通过后面代码中的DataContext的绑定集失败,但在第二个示例中工作.为什么?
为了UIManager类下面的完整性:
public class UIManager:IUIManager
{
#region Implementation of IUIManager
private const string IsLoggedInProperty = "IsLoggedIn";
private bool loggedIn;
private readonly object loggedInLock = new object();
public bool IsLoggedIn
{
get
{
lock (loggedInLock)
{
return loggedIn;
}
}
set
{
lock (loggedInLock) …Run Code Online (Sandbox Code Playgroud) Multibinding是WPF中非常强大的功能,为什么Silverlight不支持它?他们从来没有为它添加支持?它太大了,不适合.NET框架?它会在Silverlight 5中出现吗?有谁知道答案?
谢谢!
我正在尝试对数字内容进行列排序.多重绑定转换器工作正常.此解决方案将SortMemberPath设置为null
我尝试了各种各样的方式,并大量搜索互联网.
出于安全目的,代码已从原始版本修改.
<DataGridTemplateColumn x:Name="avgPriceColumn">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource avgPriceConverter}">
<Binding Path="NumberToDivideBy" />
<Binding Path="TotalDollars" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.SortMemberPath>
<MultiBinding Converter="{StaticResource avgPriceConverter}">
<Binding Path="NumberToDivideBy" />
<Binding Path="TotalDollars" />
</MultiBinding>
</DataGridTemplateColumn.SortMemberPath>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
编辑:我找到了一种方法来使数据绑定工作没有多重绑定,但排序仍然无法正常工作.由于DataGrid绑定到一个自定义类,因此我接受了整个值并从中进行转换,从而减少了对MultiBinding的需求.
<DataGridTextColumn x:Name="avgPriceColumn" Binding="{Binding Converter={StaticResource avgPriceConverter}}" SortMemberPath="{Binding Converter={StaticResource avgPriceConverter}}" />
Run Code Online (Sandbox Code Playgroud)
在这两个选项中,SortMemberPath默认设置为Binding,因此我不需要像我一样明确定义它
但是,这最终将SortMemberPath值设置为null,这与适用于我的代码环境的自定义约束冲突,并且不进行排序.所以我仍然对更好的解决方案感兴趣.
编辑:
在其他地方更改了冲突的代码,以允许重复的SortMemberPath,不支持对某些列进行排序,以及对某些列的相邻列值进行排序
在这种情况下,我希望使用资源字典中声明的字符串作为Text属性绑定的一部分.仅绑定单个动态资源字符串不是问题:
<TextBlock Text="{DynamicResource keyToMyString}" />
Run Code Online (Sandbox Code Playgroud)
但是如果你需要在MultiBinding上使用StringFormat,你很快就会遇到问题,因为你需要插入动态文本或想要组合几个字符串.例如,如果我的MultiBinding看起来像这样:
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1} some more text">
<Binding Source="{x:Static Resources:Strings.string1}" />
<Binding Source="{x:Static Resources:Strings.string2}" />
</MultiBinding>
<TextBlock.Text>
Run Code Online (Sandbox Code Playgroud)
我可以注入string1,并string2从指定的资源文件到绑定的文本,也没有问题.但我找不到以同样的方式使用动态资源中的字符串的方法.(我正在使用此方法将公司和产品名称从合并的资源字典中注入文本中).
使用TextBlock,我可以通过使用TextBlock内容的几个Run项来避免这个问题(参考):
<TextBlock >
<Run Text="{DynamicResource CompanyName}" />
<Run Text="{DynamicResource ProductName}" />
<Run Text="{DynamicResource MajorVersion}" />
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
但是当需要将动态资源绑定到Window Title属性时,这没有任何帮助.无论如何使用现有的标记扩展(如x:Static等)(创造性的,必要时)来实现这一目标?或者我们是否必须编写自己的标记扩展来实现这一目标?
我是WPF的新手,我无法在网上找到解决方案.我的问题是,我希望只有当四个文本框没有有效性错误时才启用我的按钮.我的代码是:
<Button Content="Action" Click="Action_Click" >
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource ValCon}">
<Binding ElementName="textBox1" />
<Binding ElementName="textBox2"/>
<Binding ElementName="textBox3"/>
<Binding ElementName="textBox4"/>
</MultiBinding>
</Button.IsEnabled>
</Button>
Run Code Online (Sandbox Code Playgroud)
我的多值转换器就像:
class ValidityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool b = true;
foreach (var x in values)
{
TextBox y = x as TextBox;
if (Validation.GetHasError(y))
{
b = false;
break;
}
}
return b;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException(); …Run Code Online (Sandbox Code Playgroud) 我有我的XAML引用的以下类:
public static class SearchVariables
{
public static DataGridCellInfo current_cell_match;
public static string current_cell_property;
public static void setCurrentCell(Object dgi, DataGridColumn dgc, string property_name)
{
current_cell_property = property_name;
if (property_name == null)
{
current_cell_match = new DataGridCellInfo();
}
else
{
current_cell_match = new DataGridCellInfo(dgi, dgc);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是设置一个MultiBinding Converter,它在更改时使用current_cell_match.我有以下但它抛出一个错误可以使用一些帮助来解决这个问题.
<Setter Property="helpers:SearchBehaviours.IsTextMatchFocused">
<Setter.Value>
<MultiBinding Converter="{StaticResource SelectedSearchValueConverter}" FallbackValue="False">
<Binding Path="(helpers:SearchBehaviours.IsFindPopupOpen)" RelativeSource="{RelativeSource Self}"/>
<Binding Path="(helpers:SearchVariables.current_cell_match)" />
</MultiBinding>
</Setter.Value>
</Setter>
Run Code Online (Sandbox Code Playgroud)
[编辑]
应该已经提到过这个类带有一堆附加的属性和行为,所以它在UI的一面.其中一个行为设置current_cell_match.
我正在尝试结合 Guice 的这 3 个特性:注入、多重绑定、泛型。我创建了一个生产项目的原型,所以这里是:
首先,这是泛型的一个小层次结构(在生产情况下有 N 个实体的层次结构):
public interface Type {
}
public class Type1 implements Type{
}
public class Type2 implements Type {
}
Run Code Online (Sandbox Code Playgroud)
接下来,我想通过Factory创建类ToCreate1和ToCreate2。
基类:
public abstract class AbstractToCreate<T extends Type> {
public T type;
public Integer param;
public AbstractToCreate(T type, Integer param){
this.type = type;
this.param = param;
}
}
Run Code Online (Sandbox Code Playgroud)
这是继承人:
public class ToCreate1 extends AbstractToCreate<Type1>{
@Inject
public ToCreate1(Type1 type, @Assisted Integer param) {
super(type, param);
}
}
public class …Run Code Online (Sandbox Code Playgroud) multibinding ×10
wpf ×9
c# ×6
binding ×2
xaml ×2
.net ×1
.net-4.0 ×1
button ×1
data-binding ×1
generics ×1
guice ×1
java ×1
silverlight ×1
textbox ×1
tooltip ×1