如何在网格中的列上进行两个绑定,如果第一个绑定为空或空,则将使用第二个绑定。我尝试过用FallbackValue属性来实现这一点,但是您不能只在其中绑定静态值。这里有一些代码,这不仅仅是文字!
<telerik:RadGridView x:Name="radGridView">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName,
FallbackValue=Binding FirstName2}" //You cant do that!
Header="First Name" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>在xaml中一定有什么办法可以做到的!请帮帮我!
发布于 2015-05-13 07:38:58
我至少能想到两种方法:
First解决方案(在DataContext中解决):向您的DataContext类型中添加一个属性,类似于ResolvedFirstName,其值要么从FirstName或FirstName2获取,然后当两者中的任何一个被更改时,ResolvedFirstName将被重新计算。
public string ResolvedFirstName {
get { return string.IsNullOrEmpty(FirstName) ? FirstName2 : FirstName; }
}
public string FirstName {
get {...}
set {...
RaisePropertyChanged("FirstName");
RaisePropertyChanged("ResolvedFirstName");}
}
public string FirstName2 {
get {...}
set {...
RaisePropertyChanged("FirstName2");
RaisePropertyChanged("ResolvedFirstName");}
}第二个解决方案(在视图中解决):添加一个StringMultiplexer作为StaticResource绑定到这两个属性,它提供了您的列可以绑定的输出属性。
<RadGridView>
<RadGridView.Resources>
<StringMultiplexer x:Key="FirstNameMux"
HighPrioString="{Binding FirstName}"
LowPrioString="{Binding FirstName2}"/>
</RadGridView.Resources>
<RadGridView.Columns>
<GridViewDataColumn
DataMemberBinding="{Binding Output, Source={StaticResource FirstNameMux}}"/>和代码:
public class StringMultiplexer : DependencyObject
{
public string LowPrioString
{
get { return (string) GetValue( LowPrioStringProperty ); }
set { SetValue( LowPrioStringProperty, value ); }
}
public static readonly DependencyProperty LowPrioStringProperty =
DependencyProperty.Register( "LowPrioString", typeof( string ), typeof( StringMultiplexer ), new PropertyMetadata( DetermineOutput ) );
public string HighPrioString
{
get { return (string) GetValue( HighPrioStringProperty ); }
set { SetValue( HighPrioStringProperty, value ); }
}
public static readonly DependencyProperty HighPrioStringProperty =
DependencyProperty.Register( "HighPrioString", typeof( string ), typeof( StringMultiplexer ), new PropertyMetadata( DetermineOutput ) );
public string Output
{
get { return (string) GetValue( OutputProperty ); }
set { SetValue( OutputProperty, value ); }
}
public static readonly DependencyProperty OutputProperty =
DependencyProperty.Register( "Output", typeof( string ), typeof( StringMultiplexer ), null );
private static void DetermineOutput( DependencyObject d, DependencyPropertyChangedEventArgs e )
{
((StringMultiplexer) d).DetermineOutput();
}
private void DetermineOutput()
{
Output = (string.IsNullOrEmpty( HighPrioString )) ? LowPrioString : HighPrioString;
}
}当我输入第二个解决方案时,我越来越怀疑这个解决方案不适用于您的具体情况。我自己使用了StringMultiplexer,它正在按预期工作。我在您的案例中看到的问题是: GridViewDataColumn不是FrameworkElement (据我所记得),它只是一个列定义对象,它为实际的单元格控件或行控件实例化提供了蓝图,并且DataMemberBinding很可能针对为其创建行的item对象来解决。也许您需要从GridViewDataColumn派生并在那里实现多路复用器。
发布于 2015-05-12 17:34:35
你可以用DataTriggers做这个,就像这样
<telerik:RadGridView x:Name="radGridView">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn Header="First Name">
<telerik:GridViewDataColumn.Style>
<Style TargetType="{x:Type telerik:GridViewDataColumn}">
<Setter Property="DataMemberBinding" Value="{Binding FirstName}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding FirstName}" Value="{x:Null}">
<Setter Property="DataMemberBinding" Value="{Binding FirstName2}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</telerik:GridViewDataColumn.Style>
</telerik:GridViewDataColumn>
</telerik:RadGridView.Columns>
</telerik:RadGridView>https://stackoverflow.com/questions/30197213
复制相似问题