1

TextBlockクラスのテキスト を動的に変更したい。

XAMLコード

<TextBlock Name="Footer_text"  Text=""/>

C#

string footerMainMenuText = "Setting";
Binding  set = new Binding("");
set.Mode = BindingMode.OneWay;
set.Source = footerMainMenuText;
Footer_text.DataContext = footerMainMenuText;
Footer_text.SetBinding(TextBlock.TextProperty, set);

最後の行を確認しましたFooter_text.Textが、正しく設定されています。(Footer_text.Text="Setting")がTextBlock、私のアプリケーションでは「設定」が表示されません。ここでの問題は何ですか?

4

1 に答える 1

5

バインドしている場合-代わりにXAMLでそれを実行しないのはなぜですか?あなたのコードを見ると、それはちょっと無意味です-あなたはただ行くほうがよいでしょう

Footer_text.Text = "Setting";

理想的にはXAMLで行うか、少なくともバインドするための何かを提供する必要があります

<TextBlock Text="{Binding SomeProperty}" />

なぜそれ自体で「文字列」を何かにバインドするのかわかりません...textプロパティにバインドする必要のあるオブジェクトがありますか?

また使用

Binding("")

それは何をしますか?空白のパス?バインディングターゲットがそこにあるかわからない...あなたは試しましたか

Binding()

代わりは?

編集:

また、バインディングがコントロールを更新しない理由は、おそらくINotifyPropertyChangedまたは同様のインターフェイスを実装するオブジェクトにバインドしていないためです。コントロールは値がいつ変更されたかを知る必要があるため、「string」にバインドしても、変更されたときにTextBlockに適切な通知が提供されないことを想像します。

編集2:

バインディングが機能する簡単な例を次に示します。

私のウィンドウクラスWindow.cs:

<Window x:Class="WpfApplication1.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">
    <Grid>
        <StackPanel>
        <TextBlock x:Name="txtName" Text="{Binding Name}"></TextBlock>
            <Button Click="Button_Click">Click me 1</Button>
            <Button Click="Button_Click_1">Click me 2</Button>
        </StackPanel>
    </Grid>
</Window>

Window.xaml.csの背後にあるコード

public partial class MainWindow : Window
{
    SomeObjectClass obj = new SomeObjectClass();
    public MainWindow()
    {
        InitializeComponent();

        txtName.DataContext = obj;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        obj.Name = "Hello World";
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        obj.Name = "Goobye World";
    }
}

バインドするオブジェクト(INotifyPropertyChangedを使用)

class SomeObjectClass : INotifyPropertyChanged
{
    private string _name = "hello";
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string PropertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }
}

ボタンをクリックするとSomeObject.Nameが変更されますが、テキストボックスが更新されます。

于 2012-06-30T13:29:22.773 に答える