我試圖尋找答案看類似的問題,但我找不到適合這種情況的任何東西。如何更新MainWindow中的StatusBarItem中的WPF UserControl屬性形成另一個具有不同DataContexts的UserControl?
我有一個主窗口,看起來像這樣(部分被省略):
<Window x:Class="test.MainWindow"
xmlns:local="clr-namespace:test"
xmlns:Views="clr-namespace:test.Views">
<Grid>
<DockPanel>
<StatusBar>
<StatusBarItem>
<Views:ProfileView />
</StatusBarItem>
<Separator />
<StatusBarItem>
<Views:StatusView />
</StatusBarItem>
</StatusBar>
</DockPanel>
</Grid>
</Window>
與後臺代碼:
using System.Windows;
namespace test
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// some stuff done here
}
}
和兩個用戶控件的:
<UserControl x:Class="test.Views.StatusView"
xmlns:local="clr-namespace:test.Views"
xmlns:ViewModels="clr-namespace:test.ViewModels">
<UserControl.DataContext>
<ViewModels:StatusViewModel/>
</UserControl.DataContext>
<Grid>
<Border>
<TextBlock Text="{Binding Status}" />
</Border>
</Grid>
</UserControl>
和:
<UserControl x:Class="test.Views.ProfileView"
xmlns:local="clr-namespace:test.Views"
xmlns:ViewModels="clr-namespace:test.ViewModels" MouseEnter="UserControl_MouseEnter" MouseLeave="UserControl_MouseLeave">
<UserControl.DataContext>
<ViewModels:ProfileViewModel/>
</UserControl.DataContext>
<Grid>
// some stuff done here
</Grid>
</UserControl>
與後臺代碼:
using System.Windows.Controls;
namespace test.Views
{
public partial class StatusView : UserControl
{
public StatusView()
{
InitializeComponent();
}
}
}
和:
using System.Windows.Controls;
namespace test.Views
{
public partial class ProfileView : UserControl
{
public ProfileView()
{
InitializeComponent();
}
private void UserControl_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
// Update status bar text
}
private void UserControl_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
// Update status bar text
}
}
}
具有它自己的視圖模型設置爲DataContext的每個用戶控件:
using System;
using System.ComponentModel;
namespace test.ViewModels
{
class StatusViewModel : INotifyPropertyChanged
{
private string _status = string.Empty;
public string Status
{
get { return _status; }
set { _status = value; OnPropertyChanged("Status"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public StatusViewModel() { }
}
}
和:
using System;
namespace test.ViewModels
{
class ProfileViewModel
public ProfileViewModel() { }
// some stuff done here
}
}
正如你可以從代碼ProfileView看到MouseEnter和MouseLeave事件,我想在StatusView中設置TextBlock.Text值(通過它的ViewModel.Status屬性)。
現在這裏沒有顯示,但其他類也應該能夠使用相同的原理以線程安全的方式更新狀態欄的值。
我該如何做到這一點?
我想過使用DependencyPropertyes或委託和事件,但不知道該怎麼做,因爲目前,兩個UserControls(和其他人)通過MainWindow中的XAML實例化,而不是通過代碼隱藏。我認爲應該這樣做(如果我遵循MVVM並將工作分離 - 設計師在設計程序員時進行編程),但這正是我不知道如何解決這個問題的原因。
感謝您的幫助。