![](/img/trans.png)
[英]ComputedVerticalScrollBarVisibility Trigger does not work if using binding/converter
[英]WPF Binding with converter does not work
我試圖用枚舉類型綁定XAML中的某些屬性。 它應該如何工作:我在菜單欄中有一些單選按鈕,用於設置枚舉值。 並且此枚舉值在Grid
設置isEnabled
屬性。 因此存在一個關系:單選按鈕->(EnumToBooleanConverter)->枚舉對象->(EnumToIsActiveCnoverter)-> isEnabled
屬性。 我已經編寫了兩個轉換器來執行該綁定。 碼:
<Window.Resources>
<local:EnumToBooleanConverter x:Key="actionConverter" />
<local:EnumToIsActiveConverter x:Key="activityConverter" />
</Window.Resources>
...
<MenuItem Header="Settings">
<MenuItem Header="Action">
<MenuItem Header="Draw">
<MenuItem.Icon>
<RadioButton GroupName="MenuActionButton"
IsChecked="{Binding Path=appMode,
Converter={StaticResource actionConverter},
ConverterParameter={x:Static local:ApplicationMode.Draw}}"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Edit">
<MenuItem.Icon>
<RadioButton GroupName="MenuActionButton"
IsChecked="{Binding Path=appMode,
Converter={StaticResource actionConverter},
ConverterParameter={x:Static local:ApplicationMode.Edit}}"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Constraints">
<MenuItem.Icon>
<RadioButton GroupName="MenuActionButton"
IsChecked="{Binding Path=appMode,
Converter={StaticResource actionConverter},
ConverterParameter={x:Static local:ApplicationMode.Constraints}}"/>
</MenuItem.Icon>
</MenuItem>
</MenuItem>
</MenuItem>
CS文件:
public partial class MainWindow : Window
{
public ApplicationMode appMode { get; set; }
public MainWindow()
{
this.appMode = ApplicationMode.Draw;
InitializeComponent();
}
}
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//return value.Equals(parameter);
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
public class EnumToIsActiveConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//return value.Equals(true) ? parameter : Binding.DoNothing;
return Binding.DoNothing;
}
}
public enum ApplicationMode
{
Draw,
Edit,
Constraints
}
選中EnumToIsActiveConverter
按鈕時, EnumToBooleanConverter
會將枚舉值更改為給定參數;當將枚舉值設置為給定參數時, EnumToIsActiveConverter
更改給定元素的isEnabled
屬性。 在我看來,它應該工作正常。 我在這里想念什么?
您正在使用RadioButton
控件,但僅作為指示器。
因此,單擊該項不會更改屬性值,因為只有MenuItem
會收到Click,而不是RadioButton。
這也有點浪費,因為對於V(當前活動指示),您不需要RadioButton控件,而需要具有可見性綁定的Path。
我將以現有方式為您提供解決方案:
一種。 將Click事件添加到每個MenuItem
b。 將相關的Value放入Tag屬性(這將簡化事件,如您所見)
C。 將INotifyPropertyChanged
接口的實現添加到您的MainWindow類實現中,以使XAML知道appMode修飾。
這里的代碼XAML:
<MenuItem Header="Draw" Click="MenuItem_Click" Tag="{x:Static local:ApplicationMode.Draw}" >
<MenuItem.Icon>
<RadioButton GroupName="MenuActionButton"
IsChecked="{Binding Path=appMode,
Converter={StaticResource actionConverter},
ConverterParameter={x:Static local:ApplicationMode.Draw}}"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Edit" Click="MenuItem_Click" Tag="{x:Static local:ApplicationMode.Edit}">
<MenuItem.Icon>
<RadioButton GroupName="MenuActionButton"
IsChecked="{Binding Path=appMode,
Converter={StaticResource actionConverter},
ConverterParameter={x:Static local:ApplicationMode.Edit}}"/>
</MenuItem.Icon>
</MenuItem>
MenuItem_Click for Click事件:
public event PropertyChangedEventHandler PropertyChanged;
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
var item = (MenuItem)sender;
appMode = (ApplicationMode) item.Tag;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(appMode)));
}
沒有RadioButton的更簡單的解決方案:
一種。 將MenuItem Checkable功能用於圖標作業,並將IsChecked綁定到appMode屬性:
<MenuItem Header="Action">
<MenuItem Header="Draw" IsCheckable="True"
IsChecked="{Binding Path=appMode,
Converter={StaticResource actionConverter},
ConverterParameter={x:Static local:ApplicationMode.Draw}}" />
<MenuItem Header="Edit" IsCheckable="True"
IsChecked="{Binding Path=appMode,
Converter={StaticResource actionConverter},
ConverterParameter={x:Static local:ApplicationMode.Edit}}" />
</MenuItem>
b。 在代碼中,更改屬性以觸發PropertyChange事件:
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ApplicationMode _appMode;
public ApplicationMode appMode
{
get { return _appMode; }
set
{
_appMode = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(appMode)));
}
}
public MainWindow()
{
this.appMode = ApplicationMode.Draw;
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
}
C。 在轉換器中修復ConvertBack方法:
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return parameter;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.