[英]Unable to tie a Object Property to a WPF MenuItem using Data Binding
選擇特定的MenuItem時,我試圖設置對象的屬性。 例如,如果選擇了“開始”菜單項,則該屬性應設置為TRUE。 如果選擇了其他菜單項(例如“停止”),則該屬性應設置為FALSE。 我還設置了一個Command綁定,以在選擇MenuItems之一時啟動一個單獨的窗口。 當選擇“開始”菜單項時,命令綁定起作用並啟動單獨的窗口。 但是,選擇“開始”時,該屬性不會變為TRUE。
這是我到目前為止的內容:
<Window x:Class="ServerWindows.ServerMenuBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:server="clr-namespace:ServerWindows;assembly=ServerWindows"
Title="Server Window" Height="65" Width="650" MaxWidth="650" MaxHeight="65" MinHeight="65" MinWidth="650" ResizeMode="NoResize">
<Window.Resources>
<Style x:Key="ServerStarted" TargetType="MenuItem">
<Style.Triggers>
<DataTrigger Binding="{Binding server:ServerMenuCommands.ServerStarted}" Value="true">
<Setter Property="Tag" Value="true"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="ServerStopped" TargetType="MenuItem">
<Style.Triggers>
<DataTrigger Binding="{Binding server:ServerMenuCommands.ServerStarted}" Value="false">
<Setter Property="Tag" Value="false"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<MenuItem FontSize="14" Header="Start" Command="server:ServerMenuCommands.OpenPuttyDisplayCommand" Style="{StaticResource ServerStarted}"/>
<MenuItem FontSize="14" Header="Stop" Style="{StaticResource ServerStopped}"/>
</Grid>
</Window>
類定義在靜態類中將data屬性與命令綁定結合在一起,如下所示:
public static class ServerMenuCommands
{
public static bool ServerStarted
{
get;
set;
}
public static readonly RoutedUICommand OpenPuttyDisplayCommand = new RoutedUICommand("Open Putty Display", "PUTTY_DISPLAY", typeof(ServerMenuCommands));
}
最后,在命令綁定啟動的窗口中完成屬性的使用:
if (ServerMenuCommands.ServerStarted)
{
puttyText.AppendText("\n\rServer STARTED");
puttyText.ScrollToEnd();
}
else
{
puttyText.AppendText("\n\rServer STOPPED");
puttyText.ScrollToEnd();
}
再次。 我只想設置上述屬性,這樣我就可以通過更新由命令綁定啟動的單獨窗口來向用戶發出對MenuItem“開始”或“停止”的選擇的通知。
在此先感謝您的任何幫助。
編輯
好。 在嘗試了以下答案以及對以下概述的其他一些調整之后,我無法獲得需要的工作。 似乎對我想完成的事情有誤解。 我想基於對特定菜單項控件的選擇來設置靜態對象的屬性。 看來我看到的例子反過來起作用。 根據對象的屬性(字段)的值設置控件的屬性。 這就是為什么我沒有在靜態類中創建事件的原因。 我不想在任何地方發送PropertyChanged事件。 我想將字段設置為一個值(True或False)。 感謝您為我的問題提供的潛在解決方案。 看來我只是將Click回調分配給Menu Items並以此方式設置對象Property。
編輯:編輯我終於可以根據下面的編輯答案使此工作正常。 對我來說,關鍵的更改是在XAML中添加命令綁定,然后調用更改靜態屬性的command方法。 另一個關鍵是靜態事件,並將其綁定到靜態屬性設置器,然后將其綁定到XAML中的Trigger。 周圍一切都很好!
我無法對靜態類的static屬性進行雙向(或至少是正確的單向)綁定。 似乎這是不可能的。
我可以提出的唯一方法是使類成為非靜態類(以允許其實例化)並使用資源實例綁定到其靜態屬性:
ServerMenuCommands和代碼背后:
public class ServerMenuCommands
{
public static event EventHandler ServerStartedChanged;
private static Boolean _ServerStarted;
public static Boolean ServerStarted
{
get
{
return _ServerStarted;
}
set
{
if (value != _ServerStarted)
{
_ServerStarted = value;
if (ServerStartedChanged != null)
ServerStartedChanged(typeof(ServerMenuCommands), EventArgs.Empty);
}
}
}
public static readonly RoutedUICommand OpenPuttyDisplayCommand = new RoutedUICommand("Open Putty Display", "PUTTY_DISPLAY", typeof(ServerMenuCommands));
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ServerMenuCommands.ServerStarted = !ServerMenuCommands.ServerStarted;
}
}
XAML:
<Window.CommandBindings>
<CommandBinding Command="server:ServerMenuCommands.OpenPuttyDisplayCommand" Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<Window.Resources>
<server:ServerMenuCommands x:Key="serverResource"/>
<Style x:Key="ServerStarted" TargetType="MenuItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Source={StaticResource serverResource}, Path=ServerStarted}" Value="true">
<Setter Property="Background" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="ServerStopped" TargetType="MenuItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Source={StaticResource serverResource}, Path=ServerStarted}" Value="false">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<MenuItem Header="Start" Command="server:ServerMenuCommands.OpenPuttyDisplayCommand" Style="{StaticResource ServerStarted}"/>
<MenuItem Grid.Column="1" Header="Stop" Style="{StaticResource ServerStopped}"/>
<TextBox Grid.Column="2">
<TextBox.Text>
<Binding Source="{StaticResource serverResource}" Path="ServerStarted"/>
</TextBox.Text>
</TextBox>
</Grid>
這樣可以在每次執行OpenPuttyDisplayCommand
更改其值(背景)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.