0

こんにちは私はXamlの「不明な」(文字列のみを取得する)プロパティにバインドしたい

最初はIValueConverterを作成しましたが、ConverterParameterにバインドできないため、IMultiValueConverterとして書き直しましたが、<Binding />パスなしの使用方法がわかりません。または間違っていますか?

あなたが書く<TextBlock Text="{Binding}" />とあなたはオブジェクトPersonを取得し、{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=View.Columns[0].Header}}私は最初の行のヘッダーテキストにアクセスすることができます

今、私は両方を組み合わせる必要があるだけで、プロパティを正しく取得しますか?

私のテストXamlコード:

<UserControl x:Class="Frameworktest.View.auswahl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:Frameworktest">
    <UserControl.Resources>
        <local:toPropertyConverter x:Key="PropertyConverter"/>
    </UserControl.Resources>
    <StackPanel>
        <!--...-->
        <Border BorderThickness="5" HorizontalAlignment="Left" VerticalAlignment="Top" 
                BorderBrush="Green" CornerRadius="5">
            <ListView  Name="listView1"  IsSynchronizedWithCurrentItem="False" 
                       ItemsSource="{Binding Items, UpdateSourceTrigger=PropertyChanged}" <!--ObservableCollection<Person>-->
                       SelectedItem="{Binding selectedItem, UpdateSourceTrigger=PropertyChanged}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Name">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Margin="1">
                                        <TextBlock.Text>
                                            <MultiBinding Converter="{StaticResource PropertyConverter}">
                                                <Binding /><!-- How do i {Binding} here?-->
                                                <Binding Source="{Binding RelativeSource={Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=View.Columns[0].Header}}" />
                                            </MultiBinding>
                                        </TextBlock.Text>
                                    </TextBlock>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>

                        <GridViewColumn Header="Firstname" >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Margin="1" Text="{Binding Path=Name}" Width="100"/><!--works-->
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>

                        </GridViewColumn>
                        <GridViewColumn Header="Age">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Margin="1" Text="{Binding Age}" Width="50"/><!--works-->
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                   </GridView>
                </ListView.View>
            </ListView>
        </Border>
    </StackPanel>
</UserControl>

コンバーター:

public class toPropertyConverter : IMultiValueConverter 
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values[0].GetType().GetProperty((string)values[1]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

モデル

public class Person : MBase, IContains
{
private string _name;

public string  Name
{
    get { return _name; }
    set { _name = value;
    RaisePropertyChanged(() => Reg(() => Name));
    }
}

private string _firstname;
public string  Firstname
{
    get { return _firstname; }
    set
    {
        _firstname = value;
        RaisePropertyChanged(() => Reg(() => Firstname));
    }
}

private int _age;

public int Age
{
    get { return _age; }
    set
    {
        _age = value;
        RaisePropertyChanged(() => Reg(() => Age));
    }
}

public bool Contains(string text)
{
    string pers = string.Format("{0} {1}", Firstname, Name);

    return pers.Contains(text);

}

}

現在のMultibindungを更新します

<MultiBinding Converter="{StaticResource PropertyConverter}">
       <Binding Path="."/>
       <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}" Path="View.Columns[0].Header}}" /> <!-- doesn't contain the word "Name" like i suspected -->
</MultiBinding>

最後の更新

私の場合、GridViewColumn.CellTemplateから特定の列ヘッダー値にバインドできないのは行き止まりです

4

1 に答える 1

1

{Binding} は暗黙的に {Binding Path=.} を意味します。だからあなたは使うことができます

<Binding Path="."/>
于 2012-12-10T13:55:43.807 に答える