首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FallBackValue中的Xaml -绑定

FallBackValue中的Xaml -绑定
EN

Stack Overflow用户
提问于 2015-05-12 17:01:10
回答 2查看 728关注 0票数 1

如何在网格中的列上进行两个绑定,如果第一个绑定为空或空,则将使用第二个绑定。我尝试过用FallbackValue属性来实现这一点,但是您不能只在其中绑定静态值。这里有一些代码,这不仅仅是文字!

代码语言:javascript
复制
<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中一定有什么办法可以做到的!请帮帮我!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 07:38:58

我至少能想到两种方法:

First解决方案(在DataContext中解决):向您的DataContext类型中添加一个属性,类似于ResolvedFirstName,其值要么从FirstName或FirstName2获取,然后当两者中的任何一个被更改时,ResolvedFirstName将被重新计算。

代码语言:javascript
复制
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绑定到这两个属性,它提供了您的列可以绑定的输出属性。

代码语言:javascript
复制
<RadGridView>
    <RadGridView.Resources>
        <StringMultiplexer x:Key="FirstNameMux"
            HighPrioString="{Binding FirstName}"
            LowPrioString="{Binding FirstName2}"/>
    </RadGridView.Resources>
    <RadGridView.Columns>
        <GridViewDataColumn
            DataMemberBinding="{Binding Output, Source={StaticResource FirstNameMux}}"/>

和代码:

代码语言:javascript
复制
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派生并在那里实现多路复用器。

票数 0
EN

Stack Overflow用户

发布于 2015-05-12 17:34:35

你可以用DataTriggers做这个,就像这样

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30197213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档