簡體   English   中英

無法使用數據綁定將對象屬性綁定到WPF MenuItem

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM