在新窗口中绑定TextBlock文本

本文关键字:绑定 TextBlock 文本 窗口 新窗口 | 更新日期: 2023-09-27 18:01:43

我使用window创建了一个警告窗口来验证用户的删除操作。ShowDialog和设置对话框结果。一切都很好,除了警告文本没有出现在TextBlock,我不知道为什么。这是我的Window:

<Window x:Class="RoVCo.Windows.VerifyWindow"
        ....
        WindowStyle="None" Padding="10" ResizeMode="NoResize">
        <StackPanel>
            <TextBlock Height="Auto" Text="{Binding TBText, Mode=OneWay}" Foreground="Yellow" TextWrapping="Wrap" />
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0">
                <Button Content="Cancel" Margin="10,0" Width="50" Click="CancelVerify" />
                <Button Content="OK" Width="50" Click="ConfirmVerify" />
            </StackPanel>
        </StackPanel>
</Window>

和class:

public partial class VerifyWindow : Window
{
    public VerifyWindow(string content)
    {
        InitializeComponent();
        _text = content;
    }
    private string _text = "";
    public string TBText { get { return _text; } }
    private void CancelVerify(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
        this.Close();
    }
    private void ConfirmVerify(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
        this.Close();
    }
}

我这样称呼它:

var window = new RoVCo.Windows.VerifyWindow("Removing this skill will erase all DP spent on it from all levels. Continue?");
if (window.ShowDialog() == false) return;

在新窗口中绑定TextBlock文本

为了使用绑定,你需要本地属性是公共的,并且要么是通知属性,要么是依赖属性

你可以试试这个办法。

  1. 将VerifyWindow构造函数更改为:

    公共VerifyWindow (){InitializeComponent ();}

并删除TBText和_text代码。

  1. 创建一个名为VerifyViewModel的新类

    公共类VerifyViewModel: INotifyPropertyChanged{公共VerifyViewModel(字符串内容){这一点。TBText = content;}

    public string TBText { get; private set; }
    #region INPC code - can create an abstract base view model class and put this there instead
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }
    #endregion
    

    }

  2. 调用下面的代码

    var viewmodel =移除这个技能将会清除所有关卡的DP。继续吗?");

        var window = new VerifyWindow
        {
            DataContext = viewmodel
        };
        if (window.ShowDialog() == false) return;
    

如果你在Dialog中使用的只是一个属性,我认为使用DependancyProperty将是更好的选择,然后添加所有INotifyPropertyChanged逻辑

public partial class VerifyWindow : Window
{
    public VerifyWindow(string content)
    {
        InitializeComponent();
        TBText = content;
    }
    public static readonly DependencyProperty TBTextProperty =
        DependencyProperty.Register("TBText", typeof(string), typeof(VerifyWindow), new UIPropertyMetadata(string.Empty));
    public string TBText
    {
        get { return (string)GetValue(TBTextProperty); }
        set { SetValue(TBTextProperty, value); }
    }
    private void CancelVerify(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
        this.Close();
    }
    private void ConfirmVerify(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
        this.Close();
    }
}