Binding un pulsanti IsEnabled proprietà / visibilità utilizzando i suoi x: Name come parametro in un metodo nel code-behind
-
29-09-2019 - |
Domanda
ho bisogno di passare nel nome di controlli a un metodo in un oggetto di sicurezza che restituisce un valore booleano per la proprietà IsEnabled e un altro metodo che restituisce la sua visibilità (Compresso, nascosto o visibile). Questi entrambi devono essere controllati a fini di autorizzazione.
Ho provato con un ObjectDataProvider ma tutti gli esempi mostrano solo input dell'utente da una casella di testo per i parametri. In particolare mi bisogno di passare un nome di controllo per il metodo in base al largo x del pulsante:. Nome proprietà
Qual è il modo più semplice ed efficace di gestire questo problema. Grazie in anticipo.
UPDATE: Sto cercando di utilizzare un convertitore e questo è il metodo Convert mi si avvicinò con:
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values != null)
{
DataTable tblPermissions = (DataTable)values[0];
string sFunctionName = values[1].ToString();
DataRow[] rows = tblPermissions.Select("fun_name = '" + sFunctionName + "'");
if ((bool)rows[0]["fun_enable"])
return true;
else
return false;
}
return string.Empty;
}
Il seguente è il codice XAML:
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource IsFunctionEnabledConverter}">
<Binding ElementName="{StaticResource PermissionsTable}" />
<Binding ElementName="btnSave" Path="Name" />
</MultiBinding>
</Button.IsEnabled>
Soluzione
È possibile scrivere un IValueConverter per effettuare la chiamata al metodo e passare il controllo di se stesso utilizzando {Binding RelativeSource={RelativeSource Self}, Converter={StaticResource MyConverter}}
. Nel metodo Convert è possibile lanciare il valore di controllare e accedere alla proprietà il nome del controllo da passare al metodo di protezione. Controllando il targetType è possibile determinare se emettere un valore booleano (per IsEnabled) o la visibilità enum.
*** AGGIORNAMENTO
Presumo che la risorsa "PermissionTable" usato con rilegatura il convertitore è in realtà la DataTable, ma si sta cercando di usarlo come una stringa per identificare un elemento per nome come la fonte di rilegatura. Provare a utilizzare Source="{StaticResource PermissionsTable}"
invece di passare la risorsa DataTable sé.
Altri suggerimenti
Ci possono essere diversi modi per affrontare questo problema a seconda del modo in cui hai architettato l'applicazione. Se stai usando una vista e dei comandi a seconda code-behind il percorso più semplice potrebbe essere quella di chiamare i metodi dell'oggetto di sicurezza direttamente dal codice dietro e le proprietà sorge direttamente sulle controlli in questione.
Se stai usando MVVM o non sei solo un fan di code-behind, un altro modo per aggirare questo problema potrebbe essere quella di abbandonare utilizzando il nome del pulsante e andare con un proprietà associata . proprietà associate sono un modo di usare il quadro proprietà di dipendenza WPF per memorizzare i dati su un oggetto o di controllo che l'oggetto o il controllo non originariamente dichiararsi.
Insieme con proprietà associate deriva un concetto chiamato comportamenti collegati. In sostanza, quando si crea una proprietà allegato, si è dato un gancio per un callback che si chiama ogni volta che la proprietà è impostata su un oggetto. Quando questo callback viene chiamata, si riceve l'oggetto la proprietà è stata impostata su, così come i valori vecchi e nuovi per la proprietà.
È possibile utilizzare la richiamata come un'opportunità per verificare il valore della proprietà contro il vostro oggetto di sicurezza e impostare le proprietà abilitati e visibili, come si vede in forma.
- HTH Dusty