在新窗口中绑定TextBlock文本?

时间:2013-03-01 00:39:19

标签: c# wpf window showdialog

我创建了一个警告窗口,用于验证用户的删除操作,使用Window.ShowDialog并设置DialogResult。一切正常,但警告文本没有出现在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>

上课:

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;

3 个答案:

答案 0 :(得分:0)

为了使用绑定,您需要将local属性设置为public,以及通知属性或依赖属性。

答案 1 :(得分:0)

您可以尝试此解决方案。

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

    public VerifyWindow() {     的InitializeComponent(); }

  2. 并删除TBText和_text代码。

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

      公共类VerifyViewModel:INotifyPropertyChanged {     public VerifyViewModel(字符串内容)     {         this.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 = 新的VerifyViewModel(“删除此技能将清除所有级别上花费的所有DP。继续吗?”);

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

答案 2 :(得分:0)

如果您在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();
    }
}