6

String プロパティを Button.Content にバインドしたい。

しかし、なぜうまくいかなかったのでしょうか。

データクラス:

namespace test4
{
    public class Test : INotifyPropertyChanged
    {

         string   _Text = "Begin";

        public string Text
        {
            get{return _Text;}
            protected set { _Text = value; }
        }
        public void Start()
        {
            Text = "Begin";
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(Text));
        }
        public void End()
        {
            Text = "End";
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(Text));
        }


        public event PropertyChangedEventHandler PropertyChanged;
    }
}

論理コード:

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        test4.Test ttt = new test4.Test();
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            System.Windows.Data.CollectionViewSource testViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("testViewSource")));
            testViewSource.Source = new object[]{ttt};
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (ttt.Text == "Begin")
                ttt.End();
            else
                ttt.Start();
        }
    }

XAML:

<Window x:Class="test5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:test4" Loaded="Window_Loaded">
    <Window.Resources>
        <CollectionViewSource x:Key="testViewSource" d:DesignSource="{d:DesignInstance my:Test, CreateList=true}" />
    </Window.Resources>
    <Grid DataContext="{StaticResource testViewSource}">
        <Button Content="{Binding Path=Text, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="158,95,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>
4

4 に答える 4

5

PropertyChangedEventArgsコンストラクターの呼び出しでTextを囲む引用符がありません。

Text = "Begin";
if (PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs("Text"));
于 2010-07-21T11:34:29.797 に答える
3

PropertyChanged値ではなく、変更されたプロパティの名前を確認したい。イベントの呼び出しを次のように変更します。

PropertyChanged(this, new PropertyChangedEventArgs("Text")); 

そしてそれは仕事をします。しかし、私も構造をに変更します

public string Text { 
     get{return _Text;} 
     protected set { 
          _Text = value; 
          if(null != PropertyChanged){
                 PropertyChanged(this,new PropertyChangedEventArgs("Text"));
          }   
     } 
} 

次に、StartとEndからPropertyChanged-eventを呼び出さないでください。

さらに一歩進んで、次のような呼び出しメソッドを作成します。

protected virtual void OnPropertyChanged(string propertyName) {
    OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}

protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
    if (null != PropertyChanged) {
        PropertyChanged(this,e);
    }
}

そして、あなたのプロパティセッターからそれらを呼び出します。

于 2010-07-21T11:34:26.107 に答える
2

まず、objectdataproviding を使用しましたが、オブジェクト「ttt」ではなく、2 つの異なるものです。

次に、PropertyChanged(this,new PropertyChangedEventArgs("Text"));「テキスト」は変数ではなく名前です。

したがって、コードは次のとおりです。他の人に役立つかもしれません。

データクラス:

namespace test3
{
    public class Test : INotifyPropertyChanged
    {

         string   _Text = "Begin";

        public string Text
        {
            get{return _Text;}
            protected set { _Text = value;
            NotifyPropertyChanged("Text");
            }
        }
        public void Start()
        {
            Text = "Begin";

        }
        public void End()
        {
            Text = "End";

        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        } 
    }
}

論理 cs:

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            button1.DataContext=ttt;
        } 

        Test ttt = new Test();

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (ttt.Text == "Begin")
                ttt.End();
            else
                ttt.Start();
        }
    }
}

xaml:

<Window x:Class="test3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:test3"
        Title="MainWindow" Height="350" Width="525" >
    <Grid>
        <Button Content="{Binding Path=Text,UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="121,69,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>
于 2010-07-21T11:51:02.457 に答える