2

「 」というボタンのブール プロパティを作成しようとしていますIsVisibleWhenReadOnly。これを StackPanel のボタンで使用して、データが状態にあるかどうかに応じて表示または非表示にできるようにしますReadOnly。つまり、ReadOnly状態の場合、[保存] ボタンと [キャンセル] ボタンは非表示ですが、[編集] ボタンは表示されます。[編集] ボタンをクリックすると、ReadOnly状態が false になり、[キャンセル] ボタンと [保存] ボタンが表示され、[編集] ボタンが非表示になります。

私の物件コード:

public bool IsVisibleWhenReadOnly
{
  get { return (bool)GetValue(IsVisibleWhenReadOnlyProperty); }
  set { SetValue(IsVisibleWhenReadOnlyProperty, value); }
}

// Using a DependencyProperty as the backing store for IsVisibleWhenReadOnly.
public static readonly DependencyProperty IsVisibleWhenReadOnlyProperty =
    DependencyProperty.Register("IsVisibleWhenReadOnly",
                                 typeof(bool), 
                                 typeof(Button), 
                                 new PropertyMetadata(true));

ボタンのスタイル:

<Style TargetType="{x:Type Button}">
  <Setter Property="Visibility">
    <Setter.Value>
      <Binding Path="IsVisibleWhenReadOnly" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}" Mode="OneWay">
        <Binding.Converter>
          <utils:BoolToVisibilityConverter/>
        </Binding.Converter>
      </Binding>
    </Setter.Value>
  </Setter>
</Style>

およびボタンコード:

<Button Name="btnEdit" Content="Edit" MinWidth="75" Height="25" 
    Click="btnEdit_Click" IsVisibleWhenReadOnly="true" />

IsReadOnlyうまく機能している別の依存関係プロパティであり、その値に基づいてコントロールを有効/無効にしますが、これは有効性ではなく可視性に影響を与えたいと考えています。

残念ながら、コンパイル時に 3 つのエラーが発生します。

The member "IsVisibleWhenReadOnly" is not recognized or is not accessible.
The property 'IsVisibleWhenReadOnly' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.
The property 'IsVisibleWhenReadOnly' was not found in type 'Button'.

行にあると思いますtypeOf(Button),が、それを「BaseWindow」(typeOf()「IsReadOnly」プロパティの値)に変更しても違いはありませんでした。また、私の BoolToVisibilityConverter が問題ではないと確信しています。

誰かが私が間違っていることを見て、正しい方向に向けることができますか?

編集:可能であれば、依存関係プロパティをボタンだけでなく使用したいと思います。たとえば、StackPanels、CheckBoxes など、ボタンだけに限定されないソリューションが理想的です。

4

2 に答える 2

1

既存のコントロールに便乗したい場合は、添付された依存関係プロパティを使用する必要があります。次のようなものです:

public static void SetIsVisibleWhenReadOnly(UIElement element, bool value)
{
    element.SetValue(IsVisibleWhenReadOnlyProperty, value);
}
public static bool GetIsVisibleWhenReadOnly(UIElement element)
{
    return (bool)element.GetValue(IsVisibleWhenReadOnlyProperty);
}
// Using a Registerd DependencyProperty as the backing store for IsVisibleWhenReadOnly.
public static readonly DependencyProperty IsVisibleWhenReadOnlyProperty =
        DependencyProperty.RegisterAttached("IsVisibleWhenReadOnly",
                                     typeof(bool),
                                     typeof(Button),
                                     new PropertyMetadata(true));

可視性コンバーターのマルチバインディングも検討して、返す可視性値を決定するときに IsReadOnly と IsVisibileWhenReadOnly にアクセスできるようにします。

于 2013-03-26T08:43:42.020 に答える
1

DependancyPropertyとして登録する必要がAttachedPropertyあります。他のコントロールで使用する場合は、typeof(FrameworkElement)代わりにtypeof(Button)

 public static readonly DependencyProperty IsVisibleWhenReadOnlyProperty =
    DependencyProperty.RegisterAttached("IsVisibleWhenReadOnly"
     , typeof(bool), typeof(FrameworkElement),new PropertyMetadata(true));

しかし、DataTrigger

例:

<Button>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Visibility" Value="Visible" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsVisibleWhenReadOnly}" Value="True" >
                <Setter Property="Visibility" Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button>
于 2013-03-26T08:46:09.390 に答える