1

次のトリガーを再利用するにはどうすればよいですか?これをウィンドウ内のすべてのクリアボタンに再利用する必要があります。ボタンは、リストビューでアイテムを選択した場合にのみ表示されます。Binding ElementName=teachersしたがって、 asパラメータを渡す必要があります。これを行う方法はありますか?

<Button Width="15"  Grid.Column="1" Content="X" Margin="0,2,5,2" Command="{Binding ClearSubjectCommand}" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Visibility" Value="Visible"></Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=teachers, Path=SelectedItem}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Collapsed"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

編集

添付プロパティを試してみました。しかし、成功しません。

<Button Width="15"  Grid.Column="1" Content="X" Margin="0,2,5,2" Command="{Binding ClearSubjectCommand}"
        HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
        local:ThemeProperties.BindingElementName="teachers" Style="{StaticResource cancelButton}"/> 

とスタイル、

<Style TargetType="{x:Type Button}" x:Key="cancelButton">
    <Setter Property="Visibility" Value="Visible"></Setter>
    <Style.Triggers>
        <DataTrigger Binding="{Binding  ElementName= local:ThemeProperties.BindingElementName, Path=SelectedItem}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Collapsed"></Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

クラス、

public static class ThemeProperties
{
    public static string GetBindingElementName(DependencyObject obj)
    {
        return (string)obj.GetValue(BindingElementNameProperty);
    }

    public static void SetBindingElementName(DependencyObject obj, string value)
    {
        obj.SetValue(BindingElementNameProperty, value);
    }

    // Using a DependencyProperty as the backing store for BindingElementName.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BindingElementNameProperty =
        DependencyProperty.RegisterAttached("BindingElementName", typeof(string), typeof(ThemeProperties), new FrameworkPropertyMetadata("teachers"));
}
4

2 に答える 2

2

スタイルをとして宣言し、次のようなマークアップ拡張機能Resourceを使用して再利用するのはどうですか?StaticResource

<Window.Resources>
   <Style>
      <Style x:Key="CommonButtonStyle" TargetType="{x:Type Button}">
          <Setter Property="Visibility" Value="Visible"></Setter>
          <Style.Triggers>
              <DataTrigger Binding="{Binding ElementName=teachers,
                                       Path=SelectedItem}" 
                           Value="{x:Null}">
                    <Setter Property="Visibility" Value="Collapsed"></Setter>
              </DataTrigger>
          </Style.Triggers>
      </Style>
   </Style>
</Window.Resources>

そして、さまざまなボタンに使用します-

<Button x:Name="Button1" Style="{StaticResource CommonButtonStyle}"/>
<Button x:Name="Button2" Style="{StaticResource CommonButtonStyle}"/>
<Button x:Name="Button3" Style="{StaticResource CommonButtonStyle}"/>

アップデート

ListViewのビジュアルツリーのどこかにある場合は、次のようなバインディングでinを使用する代わりに、スタイルでinButtonを使用できます-RelativeSourceElementName

<DataTrigger Binding="{Binding Path=SelectedItem, RelativeSource={RelativeSource 
                                        FindAncestor, AncestorType=ListView}}" 
                           Value="{x:Null}">

ただし、それらが関連していない場合は、を使用attached propertyしてパラメーターをスタイルに渡す必要があります。ここにあるこのリンクから始めることができます。

更新2

アタッチされたプロパティで動作しますが、コードの一部を変更します。ここにあります -

public static class ThemeProperties
{
    public static object GetSelectedValue(DependencyObject obj)
    {
        return (object)obj.GetValue(SelectedValueProperty);
    }

    public static void SetSelectedValue(DependencyObject obj, object value)
    {
        obj.SetValue(SelectedValueProperty, value);
    }

    public static readonly DependencyProperty SelectedValueProperty =
        DependencyProperty.RegisterAttached("SelectedValue", typeof(object), 
          typeof(ThemeProperties), new FrameworkPropertyMetadata(null, 
           FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));     
}

XAML- _

    <Style TargetType="{x:Type Button}" x:Key="cancelButton">
        <Setter Property="Visibility" Value="Visible"/>
        <Style.Triggers>
            <Trigger Property="local:ThemeProperties.SelectedValue"
                         Value="{x:Null}">
                <Setter Property="Visibility" Value="Collapsed"></Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

ListViewとボタンが表示されます-

   <StackPanel>
        <ListView x:Name="lstView" ItemsSource="{Binding Objects}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Button VerticalAlignment="Bottom" Height="30"  Width="100"
                local:ThemeProperties.SelectedValue="{Binding SelectedItem,
                            ElementName=lstView}"
                Style="{StaticResource cancelButton}"/>
    </StackPanel>
于 2012-11-25T18:26:17.727 に答える
0

とても時間がかかって本当に申し訳ありません。しかし、ついに私はそれを手に入れました。私はカスタムコンバーターを使用しましたが、それがあなたが望んでいたものではないことはわかっていますが、問題なく動作します。そしてそれはあなたが望む機能を提供します。

まず第一に、ここに私のSelectionToVisibilityConverterがあります

public class SelectionToVisibilityConverter : IValueConverter
{
    public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        if (value == null)
        {
            return Visibility.Collapsed;
        }
        return Visibility.Visible;
    }

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

これが私の見解です:

    <UserControl.Resources>
    <Test:SelectionToVisibilityConverter x:Key="VisibilityConverter" />
</UserControl.Resources>
<Grid>
    <ListView Height="100" HorizontalAlignment="Left" Margin="29,29,0,0" Name="listView1" ItemsSource="{Binding Path=TestItems}" SelectedItem="{Binding Path=TestItemsSelectedItem}" VerticalAlignment="Top" Width="120" />
    <ListView Height="100" HorizontalAlignment="Left" Margin="155,29,0,0" Name="listView2" ItemsSource="{Binding Path=TestItems2}" SelectedItem="{Binding Path=TestItems2SelectedItem}"  VerticalAlignment="Top" Width="120" />
    <Button Content="Button" Command="{Binding Path=ReloadCommand}" Visibility="{Binding ElementName=listView1, Path=SelectedItem, Converter={StaticResource VisibilityConverter}}" Height="23" HorizontalAlignment="Left" Margin="29,135,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
    <Button Content="Button" Command="{Binding Path=ReloadCommand}" Visibility="{Binding ElementName=listView2, Path=SelectedItem, Converter={StaticResource VisibilityConverter}}" Height="23" HorizontalAlignment="Left" Margin="155,135,0,0" Name="button2" VerticalAlignment="Top" Width="75" />
</Grid>

ListViewsのSelectedItemとボタンのReloadCommandは無視してください。これをテストするために使用しました。一部のListViewの選択されたアイテムが変更されるたびに、対応するボタンの可視性が再評価されます。

編集

私の最後のアイデアは、カスタムコントロールを作成し、このコントロールのスタイル/テンプレートを定義することです。このようなもの:

    <Style x:Key="CustomControlStyle" TargetType="{x:Type Test:MyFirstCustomControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Test:MyFirstCustomControl}">
                    <Grid>
                        <ListView Height="100" HorizontalAlignment="Left" Margin="5, 5, 0, 0" Name="listView1" VerticalAlignment="Top" Width="120" />
                        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="50,110,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding ElementName=listView, Path=SelectedItem}" Value="{x:Null}">
                            <Setter Property="Visibility" TargetName="button1" Value="Collapsed"></Setter>
                        </DataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

このようにして、そのトリガーは、設定したすべてのMyFirstConstomControl間で共有されます。

Style="{StaticResource CustomControlStyle}"

簡単なことではないと思いますが、よくわからないので、手に入れたものを持ってきます。

于 2012-11-25T21:45:37.807 に答える