0

我正在尝试 WPF 开发一个小型记分牌。

在这个项目中,我有 3 个 XAML 文件。

ControlDisplay.xaml :这是我在记分牌中为团队 1 和团队 2 设置分数的地方。现在我只有 1 个用于记分牌标题的文本框。

Layout1.xaml :第一个布局,现在只包含一个标题。

Layout2.xaml :第二个布局,同上,只包含一个标题。

我的想法如下。我更新了一个具有一个属性 Title 的单例类。Layout1 和 Layout2 的标题标签都将绑定到这个单例类属性 Title。

我为它创建了基本结构。

控制显示.xaml:

public partial class ControlDisplay : Window
{
    private IScoreboardData _scoreboardData;
    private Layout1 _layout1;
    private Layout2 _layout2;

    public ControlDisplay()
    {
        InitializeComponent();
        _scoreboardData = SimpleInjectorContainer.Container.GetInstance<IScoreboardData>();
    }

    private void ShowLayout1(object sender, RoutedEventArgs e)
    {
        _scoreboardData.Title = "Test";
        _layout1 = new Layout1();
        _layout1.Show();
    }

    private void ShowLayout2(object sender, RoutedEventArgs e)
    {
        _scoreboardData.Title = "Test";
        _layout2 = new Layout2();
        _layout2.Show();
    }
}

Layout1.xaml.cs(layout2 是 layout1 的代码副本,只是一个不同的类名)

public partial class Layout1 : Window
{
    private IScoreboardData _scoreboardData;

    public Layout1()
    {
        _scoreboardData = SimpleInjectorContainer.Container.GetInstance<IScoreboardData>();
        InitializeComponent();
    }
}

Layout1.xml

<Window x:Class="SmallScoreboard.Layout1" .... x:Name="LayoutOne">
    <StackPanel>
        <Label DataContext="{Binding ElementName=LayoutOne}" Content="{Binding _scoreboardData.Title}" />
    </StackPanel>
</Window>

记分板数据.cs

public ScoreboardData : IScoreboardData
{
    public string Title { get; set; }
}

这显然不起作用,因为我没有在任何地方注册依赖属性?如何在 ScoreboardData 类中注册依赖属性?还是有更好的方法来解决这个问题?我希望将来能够添加更多布局,并且我希望不必将基本绑定逻辑添加到每个 layout(x).xaml.cs 文件中。

更新

这是我现在的 Layout1.xaml 文件:

<Window x:Class="Simple_Scoreboard.Layout1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Layout" Height="500" Width="800" 
        ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
        WindowStyle="None"
        AllowsTransparency="True"
        ResizeMode="CanResizeWithGrip"
        x:Name="LayoutOne" MouseLeftButtonDown="DWindow_MouseLeftButtonDown">
    <StackPanel>
        <Label Content="{Binding Path=Title, Mode=OneTime}" FontSize="30" HorizontalAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" Margin="0,10,0,0" FontWeight="Bold"></Label>
    <Button Content="Button" Click="Button_Click_1"/>
    </StackPanel>
    </Window>

和 Layout1.xaml.cs

public partial class Layout1 : Window
    {
        public IScoreboardData _scoreboardData;

        public Layout1()
        {
            InitializeComponent();
            _scoreboardData = ScoreboardContainer.Container.GetInstance<IScoreboardData>();
            DataContext = _scoreboardData;
        }

        private void DWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DragMove();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {                        
            _scoreboardData.Title = "Click change title";
        }
}

最后是 ScoreboardData 类:

class ScoreboardData : IScoreboardData, INotifyPropertyChanged
    {
        private string _title;
        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Title"));
            }
        }  

        #region INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
4

1 回答 1

0

我认为您的问题在于绑定到私有字段 _scoreboardData; 你应该把它变成公共财产。但更好的解决方案是绑定到窗口 DataContext。

在窗口构造函数中

public Layout1()
{
    _scoreboardData = SimpleInjectorContainer.Container.GetInstance<IScoreboardData>();
    InitializeComponent();
    DataContext = _scoreboardData;
}

在 XAML 中

<Window x:Class="SmallScoreboard.Layout1" .... x:Name="LayoutOne">
   <StackPanel>
      <Label Text="{Binding Title}" />
   </StackPanel>
</Window>

这样,您将 scoreBoardData 作为 Window DataContext 并且所有没有明确指定源的绑定都将绑定到该对象。

更新: ScoreboardData 应该实现 INotifyPropertyChanged..

 public class ScoreboardData :IScoreboardData, System.ComponentModel.INotifyPropertyChanged
 {
     public event PropertyChangedEventHandler PropertyChanged;
     private string _title;
     public string Title
      {
          get { return _title; }
          set 
          {
              _title = value; 
               if(PropertyChanged!=null)
                  PropertyChanged(this,new PropertyChangedEventArgs("Title"));
          }
       }                
  } 
于 2013-05-02T18:01:30.693 回答