0

依存関係プロパティを使用して単純なユーザー コントロールを作成し、それをバインドしようとしましたが、うまくいかないようです。理由はわかりません。コードに直接飛び込みます。コントロールが意味をなさないという事実を無視してください。これは説明目的のためだけです (それが重要な場合は WP8 で記述されています)。

  1. 私の単純なユーザー コントロールは、基本的に、それをオフまたはオンにするプロパティを持つ行です。

    <Grid x:Name="LayoutRoot" Background="Transparent">
    <Line Height="105" Width="105" X2="100" Y2="100" Visibility="{Binding LineVisible}" Stroke="#FFFC1515" StrokeThickness="5"/>
    </Grid>
    
    public partial class SimpleUserControl : UserControl
    {
        public SimpleUserControl()
        {
            InitializeComponent();
            DataContext = this;
        }
    
        public static readonly DependencyProperty LineVisibleProperty = DependencyProperty.Register("LineVisible", typeof(bool), typeof(SimpleUserControl), new PropertyMetadata(new PropertyChangedCallback(OnLineVisibleChanged)));
        public bool LineVisible
        {
            get { return (bool)GetValue(LineVisibleProperty); }
            set { SetValue(LineVisibleProperty, value); }
        }
        private static void OnLineVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            bool newvalue = (bool)e.NewValue;
            Visibility vis = newvalue ? Visibility.Visible : Visibility.Collapsed;
            (d as SimpleUserControl).Visibility = vis;
        }
    }
    
  2. テストアプリ

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <uc:SimpleUserControl LineVisible="{Binding class1.Vis}"/>
    </Grid>
    
    public partial class MainPage : PhoneApplicationPage
    {
        public Class1 class1 { get; set; }
        public MainPage()
        {
            InitializeComponent();
            DataContext = this;
        }
        private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
        {
            class1 = new Class1() { Vis = false };
        }
    }
    
  3. バインド先の class1

    public class Class1 : INotifyPropertyChanged
    {
        private bool _vis;
        public bool Vis
        {
            get { return _vis; }
            set
            {
                _vis = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Vis"));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
    

動作しないようですが、以下のように明示的に設定すると動作します。

<uc:SimpleUserControl LineVisible="False"/>

私はそれが単純なものだと確信していますが、私はそれを見ていません。助けてくれてありがとう。

4

2 に答える 2

0

WPF コントロールのVisibilityプロパティは値を使用せず、 enumboolが必要です。したがって、次の 2 つのオプションがあります。Visibility

  1. LineVisibiltyProperty をVisibilitybool の代わりに変更します。
  2. コンバーターを使用して にバインドしbool、変換しVisibilityます。

私の意見では、これがより良い解決策であるため、2番目のオプションを使用することをお勧めします。

これは役立つかもしれません。

于 2013-04-02T13:37:26.350 に答える