1

バインディングに少し問題があります。SelectedItemので2 つのボタンをバインドしたいListBox

ListBoxはいくつかの値が含まれており、それらが表示されます (名前、年齢など)。ユーザーが の 1 つのエントリを選択すると、ListBox[削除] と [変更] の 2 つのボタンがポップアップする (<- 表示される) ため、ボタンの可視性は の にバインドされ、ListBox-Item の隣にあるSelectedItemことを意味します。 ListBox(iPhoneの「削除」ボタンのような)。

私のコードでは、アイテムを選択すると実際にボタンが表示されますが、問題は、すべてのアイテムのすべてのボタンが表示されていることです! 実際のコード (修正が必要) は次のとおりです (可視性部分)。

<Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="0" Content="Delete" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Delete}"/>
<Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="1" Content="Change" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Change}" />

しかし、誰かが完全なコードを必要とする場合は、ここにあります:

<Grid Height="Auto">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="212"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="15"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
    <ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" x:Name="lbuser" ItemsSource="{Binding Users, Mode=TwoWay}" ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.ColumnSpan="2"  SelectedItem="{Binding MySelectedListView, Mode=TwoWay}" Height="390" Width="Auto" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <Grid Grid.Column="0">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="90"/>
                            <ColumnDefinition Width="15"/>
                            <ColumnDefinition Width="150"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Path=Bezeichnung}" Grid.ColumnSpan="4" FontSize="22.5" FontWeight="ExtraBold"/>
                        <TextBlock Grid.Row="1" Text="Name"/>
                        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Name}"/>
                        <TextBlock Grid.Row="1" Grid.Column="2" Text="Age"/>
                        <TextBlock Grid.Row="1" Grid.Column="4" Text="{Binding Path=Age, Converter={StaticResource EuroConverter}}"/>
                        <TextBlock Grid.Row="2" Text="E-Mail"/>
                        <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=EMail}" Width="Auto"/>
                        <TextBlock Grid.Row="2" Grid.Column="2" Text="Phone"/>
                        <TextBlock Grid.Row="2" Grid.Column="4" Text="{Binding Path=Phone, Converter={StaticResource EuroConverter}}"/>
                        <TextBlock Grid.Row="3" Text="Born"/>
                        <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding Path=YearBorn}" Width="Auto"/>
                        <TextBlock Grid.Row="3" Grid.Column="2" Text="Birthplace"/>
                        <TextBlock Grid.Row="3" Grid.Column="4" Text="{Binding Path=Birthplace}"/>
                    </Grid>
                    <Grid Grid.Column="1">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>

                    <Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="0" Content="Delete" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Delete}"/>
                    <Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="1" Content="Change" Visibility="{Binding Path=SelectedItem, Mode=OneWay, ElementName=lbuser, Converter={StaticResource VisibilityConverter}}" Command="{Binding Change}" />
                    </Grid>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
</ListBox>
</Grid>

編集:VisibilityConverter

public class VisibilityConverter : IValueConverter
{
    #region [ IValueConverter ]

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return System.Windows.Visibility.Collapsed;

        return System.Windows.Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    #endregion
}

値は selecteditem です。つまり、ListBox に 2 つのアイテムがあり、1 つのアイテムをクリックすると、VisibilityConverter が 4 回呼び出され、Visibility が true に設定されます。コンバーターの 4 回の呼び出しにより、値は常に SelectedItem になります。

4

1 に答える 1

0

可視性を にバインドしてみてくださいMySelectedListView。これは、リストボックスの選択された項目がバインドされている ViewModels プロパティです。次に、値は正しいタイプである必要があります。

<Button DataContext="{Binding DataContext, ElementName=Window}" FontSize="15" Grid.Row="0" Content="Delete" Visibility="{Binding Path=MySelectedListView, Mode=OneWay, Converter={StaticResource VisibilityConverter}}" Command="{Binding Delete}"/>

DataContext="{Binding DataContext, ElementName=Window}"より高いレベルでデータコンテキストを設定していない場合は、省略できるはずです。

編集:User別のオプションは、ビュー モデル クラスの ButtonVisibility プロパティにバインドすることです。MySelcetedListView セッターで、既存のオブジェクトの値をCollapsedor Hidden(必要に応じて何でも) に設定し、新しいオブジェクトの値を に設定しますVisible。バインディングは次のようになりますVisibility="{Binding ButtonVisibility}"

于 2013-06-04T13:47:33.280 に答える