设置样式<UserControl.Resources>(假设转换器返回红色)
<Style x:Key="FieldToValidate" TargetType="{x:Type TextBox}">
<Setter Property="Background">
<Setter.Value>
<MultiBinding Converter="{StaticResource VisualQueueOnErrorConverter}">
<Binding RelativeSource="{RelativeSource self}" Path="Name" />
<Binding RelativeSource="{RelativeSource AncestorType={x:Type DockPanel}}" Path="DataContext.ErrorFieldName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
</MultiBinding>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Background" Value="Red">
<Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource self}}" />
<Setter Property="Foreground" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
和控制:
<TextBox Name="FirstName" Text="{Binding FirstName}" Style="{StaticResource FieldToValidate}">
Run Code Online (Sandbox Code Playgroud)
FirstName当MultiBinding转换器将背景颜色更改为红色时,预期结果是场获得焦点并且前景色变为白色,但是当场的背景变为红色时,它不会获得焦点,也不会获得新的前景色.
几乎看起来XAML解析器在属性设置器的MultiBinding转换器之前处理Trigger .
欢迎任何和所有建议!
我编写了一个MultiValueConverter,它检查给定列表是否包含给定值,如果有,则返回true.我用它来绑定自定义复选框列表.现在我想编写ConvertBack方法,这样如果选中复选框,原始值将被发送到模型.有没有办法在ConvertBack方法中访问值?
XAML:
<ListBox.ItemTemplate>
<HierarchicalDataTemplate>
<CheckBox Content="{Binding Path=Description}">
<CheckBox.IsChecked>
<MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}">
<Binding Path="Id" />
<Binding Path="DataContext.ContactTypes" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
</HierarchicalDataTemplate>
</ListBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)
当我绑定时,我得到了正确的结果但是有没有办法在转换回来时获得绑定的id?我想要实现的是,如果取消选中复选框,则将从列表中删除该值,如果选中该值,则该值将添加到列表中.
我的代码无法在启动时,因为在数值数组Converter被称为由Multibinding是不是充满了适当的值,但有值 DependencyProperty.UnsetValue.
看看转换器,看看我在哪里得到错误
public class ButtonColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string val1 = string.Format(" {0} ", values[0]);
string val2 = (string)values[1]; **//Here i am getting ==> {DependencyProperty.UnsetValue}**
return val1.Equals(val2)
? Brushes.NavajoWhite
: Brushes.White;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以下载完整代码或查看我的代码段,如下所示.
MainWindow.xaml
<Window x:Class="DataPager.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:Local="clr-namespace:DataPager.Convertor_For_BackGround">
<Grid>
<Grid.Resources> …Run Code Online (Sandbox Code Playgroud) 我问,因为它似乎不起作用.
假设我们绑定到以下对象:
public class HurrDurr
{
public string Hurr {get{return null;}}
public string Durr {get{return null;}}
}
Run Code Online (Sandbox Code Playgroud)
好吧,看来如果我们使用MultiBinding来反映这一点,就会显示回退值,对吗?
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} to the {1}"
FallbackValue="Not set! It works as expected!)">
<Binding Path="Hurr"/>
<Binding Path="Durr"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
然而,结果实际上是"对".即使强制绑定返回DependencyProperty.UnsetValue也不起作用:
<TextBlock xmnlns:base="clr-namespace:System.Windows;assembly=WindowsBase">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} to the {1}"
FallbackValue="Not set! It works as expected!)">
<Binding Path="Hurr"
FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
<Binding Path="Durr"
FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
尝试使用TargetNullValue,它也是一个半身像.
所以似乎MultiBinding永远不会使用FallbackValue.这是真的吗,还是我错过了什么? …
我有一个TextBlock.当其文本绑定为:
<Binding Path="Applicant2.Surname"/>
Run Code Online (Sandbox Code Playgroud)
它运行正常,但是我想要包含Forenames,所以将绑定更改为:
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="Applicant2.Forenames"/>
<Binding Path="Applicant2.Surname"/>
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)
这将显示{DependencyProperty.UnsetValue} {DependencyProperty.UnsetValue},直到第一次设置该值.
我怎么能阻止这个?为什么我没有遇到第一个简单绑定的问题?
是否可以在MultiBinding中将Converter绑定添加到ConverterParameter?像这样的东西:
<HierarchicalDataTemplate DataType="{x:Type Elements:RootElement}">
<HierarchicalDataTemplate.ItemsSource>
<MultiBinding Converter="{StaticResource filterConverter}" ConverterParameter="{Binding IsFilterd}">
<Binding Path="Children"/>
<Binding Path="FilterChildren"/>
</MultiBinding>
</HierarchicalDataTemplate.ItemsSource>
<TextBlock Text="{Binding Name}" FontWeight="Normal"/>
</HierarchicalDataTemplate>
Run Code Online (Sandbox Code Playgroud)
IsFiltered是应用模板的对象上的属性.我总是得到一个XAML解析器错误,在ConverterParameter中Binding不正确/允许...或者还有其他方法可以做到这一点?
映入眼帘,
于尔根
我有两个文本框,一个用于帐单地址字段,另一个用于送货地址字段.当用户在"帐单邮寄地址"文本框中键入内容时,由于以下绑定方案,送货地址文本框会获得相同的值:
<TextBox Name="txtBillingAddress" Text="{Binding BillingAddress, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<TextBox Name="txtShippingAddress">
<TextBox.Text>
<MultiBinding Converter="{StaticResource AddressConverter}">
<Binding ElementName="txtBillingAddress" Path="Text" Mode="OneWay" />
<Binding Path="ShippingAddress" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
</MultiBinding>
</TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
这在一定程度上可行.我还希望将送货地址绑定到我的数据库实体,因为帐单地址是.我的问题是,虽然发货地址文本框中填充了帐单地址中输入的内容,但在发生这种情况时不会触发ConvertBack方法.只有在货物地址文本框中直接输入内容时才会触发.
我错过了什么?
对于单个绑定,我们使用:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}">
<Binding Path=EmployeeName/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
或更短的语法:
<TextBlock
Text="{MultiBinding StringFormat=\{0\}, Bindings={Binding Path=EmployeeName}}"/>
Run Code Online (Sandbox Code Playgroud)
现在,如果你有多重绑定:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}, {2}">
<Binding Path="EmployeeName"/>
<Binding Path="Age"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
我想知道,它的短语法是什么?
<TextBlock
Text="{MultiBinding StringFormat=\{0\}, Bindings={Binding ??????}"/>
Run Code Online (Sandbox Code Playgroud) 我正在显示几个测试的结果.每个测试有2个变量,显示结果的文本和颜色随两者而变化.我有这个工作,但有很多重复的MultiBinding正在进行,我想看看有没有办法使用Style来简化XAML.
这是我的代码的简化外观:
//TestResults.cs excerpt
public class TestResults
{
private Test1Result test1 = new Test1Result();
public Test1Result Test1 { get { return test1; } }
private Test2Result test2 = new Test2Result();
public Test2Result Test2 { get { return test2; } }
}
//TestCtrl.xaml.cs excerpt
public class TestCtrl : UserControl
{
private TestResults results = new TestResults();
public TestResults Results { get { return results; } }
}
Run Code Online (Sandbox Code Playgroud)
<!-- TestCtrl.xaml excerpt -->
<UserControl x:Class="Tester.TestCtrl" x:Name="TestResultsCtrl" ...>
<!-- lots of stuff -->
<TextBlock …Run Code Online (Sandbox Code Playgroud) 所以我有以下几点:
<TextBlock.Text>
<MultiBinding StringFormat="So and so will donate {0:C0}
to {1}, bringing the
total amount to {2:C0}.">
<Binding Path="VisitorTotal" />
<Binding Path="EventName" />
<Binding Path="EventTotal" />
</MultiBinding>
</TextBlock.Text>
Run Code Online (Sandbox Code Playgroud)
我试过
, ,\n,\\n,及其各种组合.什么都不会给我换行.这是怎么回事?
multibinding ×10
wpf ×9
xaml ×6
binding ×2
c# ×2
data-binding ×2
.net ×1
textblock ×1
triggers ×1